Я создал полупрозрачное тестовое изображение, заполненное 128-альфа-черным. Я рисую, чередуя два метода: родной WPF и GDI-взаимодействие. Они выходят совершенно разными; WPF-файл сделан правильно, но GDI, по-видимому, сначала смешивается с белым, а затем рисуется:

Если нарисовано на фотографии, часть GDI осветляет то, что находится под ней, даже если цвет 0,0,0,128 должен затемнить то, что находится под ней:

Код выглядит так:
if (iteration % 2 == 0)
context.DrawImage(new BitmapImage(new System.Uri("I:/test.png")),
new Rect(0, 0, 80, 24));
else
{
var bmp = (D.Bitmap) D.Bitmap.FromFile("I:/test.png");
var handle = bmp.GetHbitmap();
var bmpSource = Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero,
Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
context.DrawImage(bmpSource, new Rect(0, 0, 80, 24));
WinAPI.DeleteObject(handle);
GC.KeepAlive(bmp);
}
Для второго изображения я изменил размер Rect для WPF, чтобы показать, что они не перекрываются.
Как правильно нарисовать полупрозрачное изображение GDI?
(да, это действительно должно быть изображение GDI по сложным причинам - на самом деле это не файл, а какой-то внешний код, но проблема легко воспроизводится из файла)