【发布时间】:2014-10-03 21:02:40
【问题描述】:
对于我正在开发的用于处理具有 Alpha 通道的图像的程序,这已成为一个严重的障碍。 我拥有的许多图像都包含颜色信息,其中 Alpha 通道是完全透明的,但是一旦我尝试将它们加载到 System.Drawing.Graphics 中,它就会将 Alpha 为 0 的任何内容更改为 Alpha 为 0 的黑色.
这是该问题的基本示例。 我环顾四周,试图找到一个原因、答案或解决方法,但我没有找到任何暗示这个问题的东西。 任何在这一点上的帮助将不胜感激。
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");
编辑:
经过进一步测试,我并没有真正看到使用 System.Drawing.Graphics 的方法,所以我唯一不是真正答案的解决方案是完全避免使用 System.Drawing.Graphics。浏览我的代码,看起来我可以避免它。 在使用 System.Drawing.Graphics 绘制形状、在图像上植入文本多年之后,我发现 System.Drawing.Graphics 有这样一个明显的缺点很烦人。
我仍然想知道我是否可以使用 System.Drawing.Graphics 并保持我的 ARGB 完好无损,但我想我现在可以不用它。
【问题讨论】:
-
我不知道,但如果 System.Drawing.Graphics 在幕后使用预乘 alpha 颜色 (cgdirector.com/quick-tip-straight-alpha-vs-premultiplied-alpha) 并因此提供您所看到的行为,我不会感到惊讶。跨度>
-
@lzcd 这就是我的想法,但 Format32bppPArgb 不应该用于预乘,而不是 Format32bppArgb?
-
哇,这很奇怪。我刚刚做了一些测试,包括查看 lockbit 结构的字节,并且必须确认您的发现。 Clear 和 FillRectangle 似乎都在创建,什么? like 预乘像素?并非如此:将颜色更改为 (10, 255, 128, 64) 会导致 (10,255,127,76)。奇怪..
标签: c# c#-4.0 graphics colors alpha-transparency