我有以下方法将BitmapImage
转换为System.Drawing.Bitmap
:
public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
Bitmap bitmap;
using (var ms = new MemoryStream())
{
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
encoder.Save(ms);
bitmap = new Bitmap(ms);
}
return bitmap;
}
每当我尝试使用返回的Bitmap对象时,都会收到以下错误:
发生OutOfMemoryException - 内存不足。
但是,每当我用以下代码替换代码时:
public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
var ms = new MemoryStream();
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
encoder.Save(ms);
return new Bitmap(ms);
}
这很好用。但是,我很确定我应该使用使用,因为MemoryStream
对象实现了IDisposable
。这是怎么回事?
答案 0 :(得分:11)
Bitmap的构造函数Bitmap Constructor (Stream)声称
您必须在Bitmap的生命周期内保持流打开。
在您的情况下,当您使用using
语句时,流(正在使用Disposable)会自动处理,因此您的Bitmap对象将变为无效。这不是你分配太多内存,而是关于那个位图指向不再存在的东西。
答案 1 :(得分:1)
@Tigran 表示绝对正确,我实施了 @CodesInChaos '解决方法:
public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
Bitmap bitmap;
using (var ms = new MemoryStream())
{
var encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
encoder.Save(ms);
using (var localBitmap = new Bitmap(ms))
{
bitmap = localBitmap.Clone(new Rectangle(0, 0, localBitmap.Width, localBitmap.Height),
PixelFormat.Format32bppArgb);
}
}
return bitmap;
}