Создание BitmapImage WPF

У меня есть ushort[], содержащий данные изображения, которые мне нужно отобразить на экране, в ту минуту, когда я создаю Windows.System.Drawing.Bitmap и преобразовываю его в BitmapImage, но это кажется медленным и неэффективным способом сделать это.

Кто-нибудь знает, какой самый быстрый способ создать BitmapImage из ushort []?

или альтернативно создать объект ImageSource из данных?

Спасибо,

Эймонн


person Eamonn McEvoy    schedule 21.03.2011    source источник


Ответы (1)


Мой предыдущий метод преобразования 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 )

person Eamonn McEvoy    schedule 21.03.2011