gpt4 book ai didi

WPF/GDI 互操作 : how do I get correct alpha?

转载 作者:行者123 更新时间:2023-12-04 16:08:18 25 4
gpt4 key购买 nike

我创建了一个半透明的测试图像,填充了 128-alpha 黑色。我在两种方法之间交替绘制它:WPF native 和 GDI 互操作。它们完全不同。 WPF 正确完成,但 GDI 在绘制之前似乎首先与白色混合:

example 1

如果在照片上绘制,GDI 部分会使其下方的内容变亮,即使 0,0,0,128 颜色应使其下方的任何内容变暗:

example 2

代码如下:

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);
}

对于第二张图片,我更改了 WPF 的 Rect 大小以显示它们不重叠。

如何正确绘制半透明 GDI 图像?

(是的,由于复杂的原因,它确实必须是 GDI 图像 - 实际上它不是来自文件,而是来自一些外部代码,但问题很容易通过文件重现)

最佳答案

我现在决定避免这个调用,而只是复制原始位图数据。编码:

var writable = new WriteableBitmap(bmp.Width, bmp.Height,
bmp.HorizontalResolution, bmp.VerticalResolution,
PixelFormats.Bgra32, null);

var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

writable.WritePixels(new Int32Rect(0, 0, bmp.Width, bmp.Height),
data.Scan0, data.Stride * bmp.Height, data.Stride);

GC.KeepAlive(bmp);
context.DrawImage(writable, new Rect(0, 0, 80, 24));

(这可能需要一个 using 或两个)

此外,如果可写位图直接用作 Image 之类的源然后调用 Freeze有助于防止更新时闪烁,但我不明白为什么有必要。

关于WPF/GDI 互操作 : how do I get correct alpha?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8686146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com