Как преобразовать System.IO.IsolatedStorage.IsolatedStorageFileStream в ImageSource?

Вопрос ясен: я пытаюсь преобразовать «System.IO.IsolatedStorage.IsolatedStorageFileStream» в ImageSource, но понятия не имею, как я могу это сделать. Я видел несколько статей, в которых говорится о преобразовании массивов байтов в Imagesource, но ничего о ISFileStreams. Если у кого-то есть решение или пример того, как действовать, пожалуйста, дайте мне знать.

Мой код:

private void Files_List_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        using (var store = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (store.FileExists(Path.Combine("wallpaper", Files_List.SelectedValue.ToString())))
            {
                using (var isoStream = store.OpenFile(Path.Combine("wallpaper", Files_List.SelectedValue.ToString()), FileMode.Open))
                {
                    //Here is where I want to set an ImageSource from isoStream!
                }
            }
        }
    }

Спасибо.


person Aymeric    schedule 24.09.2010    source источник


Ответы (1)


Ниже приведено полное рабочее приложение, использующее ваш код в загрузке.

Вы можете выбрать файлы PNG для сохранения в изолированном хранилище, а затем перезагрузить файл в отображаемое изображение. Одна вещь, которую я заметил, заключается в том, что вы должны быть осторожны, чтобы поток сохранения закрывался и чтобы PNG был совместим:

Xaml:

<UserControl x:Class="IsoStorageSilverlightApplication.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <StackPanel x:Name="LayoutRoot" Background="White">
        <Button Content="Save to Iso" Width="100" Name="saveButton" Click="saveButton_Click" Margin="10"/>
        <Button Content="Load from Iso" Width="100" Name="loadButton" Click="loadButton_Click" />
        <Image Name="image1" Stretch="Fill" Margin="10"/>
    </StackPanel>
</UserControl>

Код позади:

using System.IO;
using System.IO.IsolatedStorage;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;

namespace IsoStorageSilverlightApplication
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void saveButton_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "PNG Files (.png)|*.png|All Files (*.*)|*.*";
            dialog.FilterIndex = 1;
            if (dialog.ShowDialog() == true)
            {
                System.IO.Stream fileStream = dialog.File.OpenRead();

                using (var store = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    // Create a directory at the root of the store.
                    if (!store.DirectoryExists("Images"))
                    {
                        store.CreateDirectory("Images");
                    }

                    using (IsolatedStorageFileStream isoStream = store.OpenFile(@"Images\UserImageFile.png", FileMode.OpenOrCreate))
                    {
                        byte[] bytes = new byte[fileStream.Length];
                        fileStream.Read(bytes, 0, (int)fileStream.Length);
                        isoStream.Write(bytes, 0, (int)fileStream.Length);
                    }
                }
            }
        }

        private void loadButton_Click(object sender, RoutedEventArgs e)
        {
            using (var store = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (store.FileExists(@"Images\UserImageFile.png"))
                {
                    using (var isoStream = store.OpenFile(@"Images\UserImageFile.png", FileMode.Open, FileAccess.Read))
                    {
                        var len = isoStream.Length;
                        BitmapImage b = new BitmapImage();
                        b.SetSource(isoStream);
                        image1.Source = b;
                    }
                }
            }
        }
    }
}
person Gone Coding    schedule 24.09.2010
comment
Я пробовал этот код раньше, и он выдавал следующую ошибку: катастрофический сбой (исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED)) - person Aymeric; 24.09.2010
comment
@Ephismen: Я предоставил вам полное одностраничное приложение, которое может сохранять и загружать изображения PNG в / из изолированного хранилища в качестве теста для вас. - person Gone Coding; 24.09.2010
comment
@HiTech Magic: Прежде всего, спасибо за предоставленный код, я скопировал его точно таким, какой он есть, и адаптировал к нему свой XAML. Но я все еще получаю ту же ошибку, что бы я ни делал. Проблемными по-прежнему являются части b.SetSource(isoStream). На данный момент я понятия не имею, что делать. - person Aymeric; 27.09.2010
comment
@Ephismen: Вы сначала попробовали мой пример в качестве отдельного приложения SL, чтобы увидеть, есть ли проблема с конкретными изображениями, которые вы пытаетесь показать? У меня были ошибки только с определенными файлами PNG, поэтому может возникнуть вопрос о точном используемом формате. Если вы можете опубликовать какие-либо изображения (или связаться с нами через наш веб-сайт), мы можем попробовать их здесь. Ваше здоровье. - person Gone Coding; 27.09.2010
comment
Ты был прав. Я скопировал весь ваш код в автономное приложение, и оно хорошо работало с файлами *.PNG. Но на некоторых BMP файлах я проверял длину при сохранении их в магазин и длину при загрузке, я был удивлен, увидев, что их размер иногда удваивался. Я собираюсь просмотреть код в своем приложении. Я дам вам знать, когда это сработает, спасибо за ваши наблюдения. - person Aymeric; 27.09.2010
comment
@Ephismen: Silverlight не поддерживает файлы BMP (только JPG и PNG). Вы их конвертировали? - person Gone Coding; 27.09.2010
comment
Я конвертировал их, но я думаю, что проблема была не в этом, а в том, как я сохранял их в IsolatedStorage. В приведенном вами примере все отлично работает с PNG и JPEG. Спасибо еще раз! - person Aymeric; 27.09.2010