gpt4 book ai didi

c# - 为什么当 Alpha==0 时 System.Drawing.Graphics 会消隐 RGB channel ?

转载 作者:行者123 更新时间:2023-11-30 18:28:19 24 4
gpt4 key购买 nike

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

最佳答案

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

“前景图像的格式无关紧要(假定它具有 alpha),因为您将其设置为 Gdiplus::Color。颜色值被定义为非预乘,因此 gdiplus 将组件乘以当它清除前景图像时的 alpha 值。另一种方法是让颜色值根据渲染目标的格式具有不同的含义,而这种方式是疯狂的。”

“如果你真的想要这种级别的渲染控制,你必须锁定位图位并自己完成。”

所以,我自己做。

关于c# - 为什么当 Alpha==0 时 System.Drawing.Graphics 会消隐 RGB channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25236422/

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