为什么当 Alpha==0 时 System.Drawing.Graphics 会清空 RGB 通道?

2024-04-03

这已经成为我正在开发的处理具有 Alpha 通道的图像的程序的严重障碍。 我拥有的许多图像都包含颜色信息,其中 Alpha 通道是完全透明的,但是一旦我尝试将它们加载到 System.Drawing.Graphics 中,它就会将 Alpha 为 0 的任何内容更改为 Alpha 为 0 的黑色。

这是该问题的基本示例。 我环顾四周试图找到原因、答案或解决方法,但我还没有找到任何暗示这个问题的东西。Any此时,我们将不胜感激。

var myTestTransparentColor = Color.FromArgb(0, 255, 128, 64);
var image = new Bitmap(135, 135, PixelFormat.Format32bppArgb);

using (var g = Graphics.FromImage(image))
{
    g.Clear(myTestTransparentColor);
}

var color = image.GetPixel(0, 0);

Debug.Assert(color == myTestTransparentColor, "channels must match original");

EDIT:

经过进一步的测试后,我并没有真正看到使用 System.Drawing.Graphics 的出路,所以我唯一的解决方案(不是真正的答案)是完全避免 System.Drawing.Graphics 。看看我的代码,看起来我可以避免它。 就在使用 System.Drawing.Graphics 绘制形状、在图像上植入文本多年之后,我发现 System.Drawing.Graphics 出现这样的重大缺陷很令人恼火。

我仍然想知道我是否可以使用 System.Drawing.Graphics 并保持我的 ARGB 完好无损,但我想我现在可以没有它。


我认为 Vincent Povirk 在这里恰当地回答了我的问题:使用 GDI+ 绘制 PixelFormat32bppPARGB 图像使用传统公式而不是预乘公式 https://stackoverflow.com/questions/19809506/drawing-pixelformat32bpppargb-images-with-gdi-uses-conventional-formula-instead

“前景图像的格式并不重要(假设它有 alpha),因为您将其设置为 Gdiplus::Color。颜色值被定义为非预乘,因此 gdiplus 在以下情况下将分量乘以 alpha 值:它会清除前景图像。另一种选择是颜色值根据渲染目标的格式具有不同的含义,这就是疯狂。”

“如果您确实想要对渲染进行这种级别的控制,则必须锁定位图位并自己完成。”

所以,我自己做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么当 Alpha==0 时 System.Drawing.Graphics 会清空 RGB 通道? 的相关文章

随机推荐