Ответ Рэй Бернса приводит к утечке памяти, так как
oldBitmap.GetHbitmap(System.Drawing.Color.Transparent)
выделяет память, которая никогда не освобождается.
Как указано в разделе «Примечания» в документации для GetHbitmap
( Документы Microsoft ):
Вы несете ответственность за вызов метода GDI DeleteObject для освобождения памяти, используемой объектом растрового изображения GDI.
Следуя документации, освобождается память путем импорта и использования DeleteObject()
:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
var hBitmap = someBitmap.GetHbitmap(...);
// Do something with hBitmap
DeleteObject(hBitmap);
Таким образом, ответ Рэй Бернса следует изменить на:
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
...
var oldImage = ...; // System.Drawing.Image
var oldBitmap =
oldImage as System.Drawing.Bitmap ??
new System.Drawing.Bitmap(oldImage);
var hOldBitmap = oldBitmap.GetHbitmap(System.Drawing.Color.Transparent);
var bitmapSource =
System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
hOldBitmap,
IntPtr.Zero,
new Int32Rect(0, 0, oldBitmap.Width, oldBitmap.Height),
null);
DeleteObject(hOldBitmap);