如何在WPF中将WriteableBitmap对象转换为BitmapImage对象

7

如何在WPF中将WriteableBitmap对象转换为BitmapImage对象?

这个链接覆盖了Silverlight,但是在WPF中过程不同,因为WriteableBitmap对象没有SaveJpeg方法。

所以我的问题是如何在WPF中将WriteableBitmap对象转换为BitmapImage对象?


1
请参考这个答案,并将RenderTargetBitmap替换为WriteableBitmap。你为什么需要进行这种转换?通常情况下是不必要的,因为BitmapImage和WriteableBitmap都有一个共同的基类BitmapSource,它提供了图像的所有相关属性。 - Clemens
1个回答

16

您可以使用其中一个BitmapEncodersWriteableBitmap帧保存到新的BitmapImage中。

在此示例中,我们将使用PngBitmapEncoder,但请根据您的情况选择适合您的编码器。

public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm)
{
    BitmapImage bmImage = new BitmapImage();
    using (MemoryStream stream = new MemoryStream())
    {
        PngBitmapEncoder encoder = new PngBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(wbm));
        encoder.Save(stream);
        bmImage.BeginInit();
        bmImage.CacheOption = BitmapCacheOption.OnLoad;
        bmImage.StreamSource = stream;
        bmImage.EndInit();
        bmImage.Freeze();
    }
    return bmImage;
}

使用说明:

 BitmapImage bitmap = ConvertWriteableBitmapToBitmapImage(your writable bitmap);

或者你可以把它作为一个扩展方法以便于使用

public static class ImageHelpers
{
    public static BitmapImage ToBitmapImage(this WriteableBitmap wbm)
    {
        BitmapImage bmImage = new BitmapImage();
        using (MemoryStream stream = new MemoryStream())
        {
            PngBitmapEncoder encoder = new PngBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(wbm));
            encoder.Save(stream);
            bmImage.BeginInit();
            bmImage.CacheOption = BitmapCacheOption.OnLoad;
            bmImage.StreamSource = stream;
            bmImage.EndInit();
            bmImage.Freeze();
        }
        return bmImage;
    }
}

用法:

WriteableBitmap wbm = // your writeable bitmap

BitmapImage bitmap = wbm.ToBitmapImage();

1
不要忘记倒回流。保存后,在设置 bmImage.StreamSource 之前执行 stream.Seek(0, SeekOrigin.Begin);。一些解码器(例如JPG)需要这样做。请参见此处 - Clemens
谢谢你们俩,非常有帮助! - JMK
@JMK 我仍然怀疑这种转换是否真的有必要。 - Clemens

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