C# 保存位图图像列表

C# 保存位图图像列表,c#,uwp,file-storage,C#,Uwp,File Storage,我有一个位图图像列表。我需要将它们保存到本地文件夹。 这在windows 10通用应用程序上不起作用 var serializer = new DataContractSerializer(typeof(List<BitmapImage>)); using (var stream = await ApplicationData.Current.LocalCacheFolder.OpenStreamForWriteAsync(fileName, CreationCollisio

我有一个位图图像列表。我需要将它们保存到本地文件夹。 这在windows 10通用应用程序上不起作用

var serializer = new DataContractSerializer(typeof(List<BitmapImage>));
    using (var stream = await ApplicationData.Current.LocalCacheFolder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting)) {
            serializer.WriteObject(stream, collection);
        }

位图图像
不可序列化。将其转换为字节数组,并将其写入磁盘:

public static byte[] ConvertToBytes(BitmapImage bitmapImage)
{
    using (var ms = new MemoryStream())
    {
        var btmMap = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
        btmMap.SaveJpeg(ms, bitmapImage.PixelWidth, bitmapImage.PixelHeight, 0, 100);
        return ms.ToArray();
    }
}

var serializer = new DataContractSerializer(typeof(byte[]));
    using (var stream = await ApplicationData.Current.LocalCacheFolder.OpenStreamForWriteAsync(fileName, CreationCollisionOption.ReplaceExisting)) {
        serializer.WriteObject(stream, ConvertToBytes(collection));
    }

无法从中提取位图。无法将
位图图像
直接保存到文件中。唯一的办法是记住原始来源并保存下来。有关将
位图图像
保存到文件的更多详细信息,请参考

例如,如果您知道原始源,您可以从
FileOpenPicker
拾取的文件中读取
BitmapImage
,然后您可以将图像文件读取到,然后您可以提取图像,用编码,然后将结果流保存到
StorageFile
,如Rob所述。示例代码如下:

private async void btncreate_Click(object sender, RoutedEventArgs e)
{
    FileOpenPicker openpicker = new FileOpenPicker();
    openpicker.FileTypeFilter.Add(".jpg");
    openpicker.FileTypeFilter.Add(".png");
    StorageFile originalimage = await openpicker.PickSingleFileAsync();
    WriteableBitmap writeableimage1;
    using (IRandomAccessStream stream = await originalimage.OpenAsync(FileAccessMode.Read))
    {
        SoftwareBitmap softwareBitmap;
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
        softwareBitmap = await decoder.GetSoftwareBitmapAsync();
        writeableimage1 = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight);
        writeableimage1.SetSource(stream);
    }
    StorageFolder folder = ApplicationData.Current.LocalFolder;
    StorageFile newimage = await folder.CreateFileAsync(originalimage.Name, CreationCollisionOption.ReplaceExisting);
    using (IRandomAccessStream ras = await newimage.OpenAsync(FileAccessMode.ReadWrite))
    {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, ras);
        var stream = writeableimage1.PixelBuffer.AsStream();
        byte[] buffer = new byte[stream.Length];
        await stream.ReadAsync(buffer, 0, buffer.Length);
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)writeableimage1.PixelWidth, (uint)writeableimage1.PixelHeight, 96.0, 96.0, buffer);
        await encoder.FlushAsync();
    }
}

对于图像列表,您可能需要逐个保存。

“这不起作用”-您遇到了什么错误?请查看编辑后的问题。Thankshow是否将字节转换回位图图像?
private async void btncreate_Click(object sender, RoutedEventArgs e)
{
    FileOpenPicker openpicker = new FileOpenPicker();
    openpicker.FileTypeFilter.Add(".jpg");
    openpicker.FileTypeFilter.Add(".png");
    StorageFile originalimage = await openpicker.PickSingleFileAsync();
    WriteableBitmap writeableimage1;
    using (IRandomAccessStream stream = await originalimage.OpenAsync(FileAccessMode.Read))
    {
        SoftwareBitmap softwareBitmap;
        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
        softwareBitmap = await decoder.GetSoftwareBitmapAsync();
        writeableimage1 = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight);
        writeableimage1.SetSource(stream);
    }
    StorageFolder folder = ApplicationData.Current.LocalFolder;
    StorageFile newimage = await folder.CreateFileAsync(originalimage.Name, CreationCollisionOption.ReplaceExisting);
    using (IRandomAccessStream ras = await newimage.OpenAsync(FileAccessMode.ReadWrite))
    {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, ras);
        var stream = writeableimage1.PixelBuffer.AsStream();
        byte[] buffer = new byte[stream.Length];
        await stream.ReadAsync(buffer, 0, buffer.Length);
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)writeableimage1.PixelWidth, (uint)writeableimage1.PixelHeight, 96.0, 96.0, buffer);
        await encoder.FlushAsync();
    }
}