2

我已经实现了一个典型的洪水填充算法,当我使用 ARGB 组件之间的欧几里德距离来比较颜色时,它在使用纯色时按预期工作。

我的问题是,如果您在透明背景上绘制抗锯齿红线之类的东西,我的泛光填充算法将不会填充大多数半透明像素,从而在对象周围留下条纹。特别是对于这个例子,线条的中心是纯红色(即 ARGB 格式的 (255, 255, 0, 0)),线条的边缘也是纯红色,但这些像素的 alpha 范围低至 1% alpha (即 (1, 255, 0, 0))。一般来说,我希望能够绘制一个抗锯齿的圆形轮廓,在中心填充填充而不让它留下边缘。

我使用什么函数来比较颜色和/或如何调整泛光填充算法,以便不会在对象周围留下这样的边缘?

我试过告诉算法,如果它的 alpha <90%,总是填充一个像素,这有时看起来不错,但它在填充微弱的线条时过于激进。

编辑:为了详细说明 0 - 5 代表红色像素 0、20、40、60、80 和 100% alpha 的情况,抗锯齿红线的图像可能如下所示:

0 0 0 0 0 0 0

0 0 0 3 0 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 3 5 3 0 0

0 0 0 3 0 0 0

0 0 0 0 0 0 0

我当前在左上角填充红色的洪水填充算法会将所有 0 替换为 5。剩余的 3 会在线周围形成一个难看的光环。

4

1 回答 1

0

您的泛光填充应替换颜色的 RGB 部分,但保留原始 alpha。这样你就可以在不改变混合比例的情况下获得新颜色。

(如果您的位图使用预乘 alpha,那么您应该通过现有 alpha 缩放替换 RGB,但在您的示例中,您没有使用预乘 alpha。)

于 2011-05-22T13:56:40.830 回答