如何将 WriteableBitmap 保存为文件?

5
我有一个WriteableBitmap需要保存到文件。我有一种感觉,我需要WriteableBitmap.PixelBuffer上的AsStream()拓展方法。然而,我没有在我的WriteableBitmap上看到该拓展方法。
  1. 所有WriteableBitmap都应该有AsStream()吗?
  2. 一旦我得到AsStream(),下一步该怎么做?

我漏掉了 using System.Runtime.InteropServices.WindowsRuntime;。这就是为什么我没有看到 AsStream() 的原因。 - royco
1个回答

14

给你了!!!

using System.Runtime.InteropServices.WindowsRuntime;

private async Task<StorageFile> WriteableBitmapToStorageFile(WriteableBitmap WB, FileFormat fileFormat)
{
    string FileName = "MyFile.";
    Guid BitmapEncoderGuid = BitmapEncoder.JpegEncoderId;
    switch (fileFormat)
    {
        case FileFormat.Jpeg:
            FileName += "jpeg";
            BitmapEncoderGuid = BitmapEncoder.JpegEncoderId;
            break;

        case FileFormat.Png:
            FileName += "png";
            BitmapEncoderGuid = BitmapEncoder.PngEncoderId;
            break;

        case FileFormat.Bmp:
            FileName += "bmp";
            BitmapEncoderGuid = BitmapEncoder.BmpEncoderId;
            break;

        case FileFormat.Tiff:
            FileName += "tiff";
            BitmapEncoderGuid = BitmapEncoder.TiffEncoderId;
            break;

        case FileFormat.Gif:
            FileName += "gif";
            BitmapEncoderGuid = BitmapEncoder.GifEncoderId;
            break;
    }

    var file = await Windows.Storage.ApplicationData.Current.TemporaryFolder.CreateFileAsync(FileName, CreationCollisionOption.GenerateUniqueName);
    using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
    {
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoderGuid, stream);
        Stream pixelStream = WB.PixelBuffer.AsStream();
        byte[] pixels = new byte[pixelStream.Length];
        await pixelStream.ReadAsync(pixels, 0, pixels.Length);

        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
                            (uint)WB.PixelWidth, 
                            (uint)WB.PixelHeight, 
                            96.0, 
                            96.0, 
                            pixels);
        await encoder.FlushAsync();
    }
    return file;
}

private enum FileFormat
{
    Jpeg,
    Png,
    Bmp,
    Tiff,
    Gif
}

WB.PixelBuffer.AsStream()处,我得到了一个错误:'Windows.Storage.Streams.IBuffer'不包含名为'AsStream'的定义,并且最佳的扩展方法重载'System.IO.WindowsRuntimeStreamExtensions.AsStream(Windows.Storage.Streams.IRandomAccessStream)'有一些无效的参数。 - royco
3
你需要添加 using System.Runtime.InteropServices.WindowsRuntime; - Farhan Ghumra
为什么图像保存时不是透明的图像? - gayan1991
嗨,@Xyroid,如果我们使用它,我们是否应该尊重文件格式?具体来说,假设我从PNG文件创建一个WriteableBitmap,然后将其编码为JPEG..这是个好主意吗? - dude

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