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