我有一个包含图像数据的 ushort[] 数组需要在屏幕上显示,目前我正在创建一个 Windows.System.Drawing.Bitmap,并将其转换为 BitmapImage,但这种方法感觉很慢且低效。
有人知道创建 ushort[] 的 BitmapImage 最快的方法是什么吗?
或者从数据中创建一个 ImageSource 对象也可以。
谢谢,
Eamonn
我有一个包含图像数据的 ushort[] 数组需要在屏幕上显示,目前我正在创建一个 Windows.System.Drawing.Bitmap,并将其转换为 BitmapImage,但这种方法感觉很慢且低效。
有人知道创建 ushort[] 的 BitmapImage 最快的方法是什么吗?
或者从数据中创建一个 ImageSource 对象也可以。
谢谢,
Eamonn
我之前将Bitmap转换为BitmapImage的方法是:
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Png);
ms.Position = 0;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = ms;
bi.EndInit();
Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
编辑: 任何使用此代码的人都应该知道,bitmap.GetHbitmap会创建一个未托管的对象,由于这是未托管的,它不会被.net垃圾收集器拾取,必须删除以避免内存泄漏,请使用以下代码解决此问题:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
IntPtr hBitmap = bitmap.GetHbitmap();
try
{
imageSource = Imaging.CreateBitmapSourceFromHBitmap(hBitmap,
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
catch (Exception e) { }
finally
{
DeleteObject(hBitmap);
}
导入像这样的dll似乎不太整洁,但这段代码是从msdn上找来的,看起来似乎是解决这个问题的唯一方法 - http://msdn.microsoft.com/en-us/library/1dz311e4.aspx