如何将'System.IO.IsolatedStorage.IsolatedStorageFileStream'转换为ImageSource?

4
问题很明确:我试图将“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!
                }
            }
        }
    }

谢谢你。

感谢您。

1个回答

7
以下是使用您在加载中的代码完成的完整工作应用程序。
您可以选择要保存到隔离存储的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;
                    }
                }
            }
        }
    }
}

@Ephismen:我已经为您提供了一个完整的1页应用程序,可以作为测试保存和加载PNG图像到/从隔离存储。 - iCollect.it Ltd
@HiTech Magic:首先感谢您提供的代码,我完全按照它的样子复制并调整了我的XAML。但是无论我怎么做,我仍然遇到相同的错误。问题仍然出在b.SetSource(isoStream)这一部分。此时我不知道该怎么办了。 - Aymeric
1
@Ephismen:你有试过先将我的示例作为独立的SL应用程序运行,以查看您尝试显示的特定图像是否存在问题吗?我只在特定PNG文件中出现了错误,因此它可能对使用的确切格式很挑剔。如果您可以发布任何图像(或通过我们的网站与我们联系),我们可以在此处进行尝试。干杯。 - iCollect.it Ltd
你是对的。我把你的所有代码复制到一个独立的应用程序中,它可以很好地处理*.PNG文件。但是在一些BMP文件上,当我将它们保存到存储器中并加载它们时,我检查了它们的长度,惊讶地发现它们的大小有时会翻倍。我将重新审查我的应用程序中的代码。无论如何,当它能够正常工作时,我会告诉你的。感谢你的观察。 - Aymeric
@Ephismen:Silverlight不支持BMP文件(仅支持JPG和PNG)。你是在转换它们吗? - iCollect.it Ltd
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接