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