创建一个BitmapImage WPF

3

我有一个包含图像数据的 ushort[] 数组需要在屏幕上显示,目前我正在创建一个 Windows.System.Drawing.Bitmap,并将其转换为 BitmapImage,但这种方法感觉很慢且低效。

有人知道创建 ushort[] 的 BitmapImage 最快的方法是什么吗?

或者从数据中创建一个 ImageSource 对象也可以。

谢谢,

Eamonn

1个回答

5

我之前将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


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