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

时间:2014-08-11 05:35:15

标签: c# c#-4.0 graphics colors alpha-transparency

这已经成为我正在努力操作具有Alpha通道的图像的程序的严重阻碍。 我的许多图像都包含Alpha通道完全透明的颜色信息,但是当我尝试将它们加载到System.Drawing.Graphics中时,它会将Alpha为0的任何内容更改为Alpha,其中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完好无损,但我想我现在可以没有它。

1 个答案:

答案 0 :(得分:0)

我认为Vincent Povirk在这里恰当地回答了我的问题:Drawing PixelFormat32bppPARGB images with GDI+ uses conventional formula instead of premultiplied one

"前景图像的格式并不重要(因为它具有alpha),因为您将其设置为Gdiplus :: Color。颜色值定义为非预乘,因此gdiplus在清除前景图像时将组件乘以alpha值。另一种选择是Color值具有不同的含义,具体取决于渲染目标的格式,这种方式就是疯狂。"

"如果您真的想要对渲染进行这种级别的控制,那么您必须锁定位图位并自行完成。"

所以,我自己这样做。