这已经成为我正在开发的处理具有 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(使用前将#替换为@)