Создание BitmapImage WPF - PullRequest
       24

Создание BitmapImage WPF

3 голосов
/ 21 марта 2011

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

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

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

Спасибо,

Имон

1 Ответ

5 голосов
/ 21 марта 2011

Мой предыдущий метод для преобразования 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 like like, но это было взято из msdn, и, кажется, единственный способ обойти эту проблему - http://msdn.microsoft.com/en-us/library/1dz311e4.aspx)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...