【发布时间】:2016-02-05 18:08:26
【问题描述】:
以下代码将创建一个透明位图,然后在其上绘制一个带有抗锯齿的白色椭圆。
using(var background = new Bitmap(500, 500))
using (var graphics = Graphics.FromImage(background))
{
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.Clear(Color.Transparent);
graphics.DrawEllipse(new Pen(Color.White, 50), 250, 250, 150, 150);
background.Save("test.png", ImageFormat.Png);
}
我发现的错误是椭圆边缘周围的抗锯齿像素具有意想不到的颜色。它们的 RGB 值为 (254,254,254) 而不是 (255,255,255)。由于 GDI+ 将透明定义为 ARGB (0,255,255,255),将白色定义为 (255,255,255,255),为什么混合后会看到 254?
【问题讨论】:
-
我想这是一个精度问题...背景颜色是什么?
-
背景颜色为 Color.Transparent ARGB (0,255,255,255)。所以我不确定精度在哪里丢失。
-
对特定像素有贡献的前景色根据其子像素前景覆盖范围混合在一起,忽略背景的贡献。 w3.org/Conferences/WWW4/Papers/53/gq-trans.html
-
您要求 GDI+ 做一些不可能的事情:渲染可与任何背景混合的抗锯齿像素。这不能按设计工作,只有当背景颜色与混合颜色匹配时,图像边缘才会看起来不错。最好不要尝试,使用 SmoothingMode.None 你会得到一个纯白色的边缘。
标签: c# gdi+ transparent antialiasing