如何在WPF中将WriteableBitmap
对象转换为BitmapImage
对象?
这个链接覆盖了Silverlight,但是在WPF中过程不同,因为WriteableBitmap
对象没有SaveJpeg
方法。
所以我的问题是如何在WPF中将WriteableBitmap
对象转换为BitmapImage
对象?
如何在WPF中将WriteableBitmap
对象转换为BitmapImage
对象?
这个链接覆盖了Silverlight,但是在WPF中过程不同,因为WriteableBitmap
对象没有SaveJpeg
方法。
所以我的问题是如何在WPF中将WriteableBitmap
对象转换为BitmapImage
对象?
您可以使用其中一个BitmapEncoders
将WriteableBitmap
帧保存到新的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();
bmImage.StreamSource
之前执行 stream.Seek(0, SeekOrigin.Begin);
。一些解码器(例如JPG)需要这样做。请参见此处。 - Clemens