0

我正在使用 ImageSharp 库(在 NuGet 上以 1.0.0-beta0001 的形式提供)在 .NET Core 2.0 中进行图像生成和操作,并且遇到了一些我似乎无法解决的问题。

这个例子为基础,我试图圆化一个白色图像的角落。我发现IPath被打孔的透明角最终会变成黑色的抗锯齿,就好像透明的“颜色”是黑色或灰色(而它根本不应该被视为任何颜色)。

这是图像的右上象限,以说明我的意思:

抗锯齿期望与结果

我尝试了PixelBlenderMode这部分代码的所有选项,但没有一个产生我所追求的:

img.Mutate(x => x.Fill(Rgba32.Transparent, corners, new GraphicsOptions(true)
{
  BlenderMode = PixelBlenderMode.Src // enforces that any part of this shape that has color is punched out of the background
}));
4

1 回答 1

0

您看到的问题是不正确的像素采样的结果。透明度低的像素对单个组件的平均值影响太大。

引用下面链接中的一些文本作为示例,因为它很好地解释了这些问题。

白色区域中的像素具有RGBA(1.00, 1.00, 1.00, 1.00)的颜色。红色区域中的像素具有颜色RGBA(1.00, 0.00, 0.00, 0.10)。如果将这些数字平均在一起,则得到(1.00, 0.50, 0.50, 0.55)。如果您以直接的方式调整图像大小,这就是边界上典型像素的颜色。但是那种颜色——半透明的浅红色——是错误的颜色!您可以在边界周围看到一个微弱的红色光晕,它不应该存在:

http://entropymine.com/imageworsener/resizealpha/

修复很简单,在采样之前必须先将值预乘以其 alpha 分量。

但是,我不知道这个问题是由于调整生成的图像的大小(在最新的 nightlies 中修复)还是在填充过程中发生的。我需要先查看示例代码才能确定,因为我不知道您是如何提供源图像的。

于 2018-02-14T14:28:15.227 回答