【问题标题】:Flood fill algorithm that takes alpha into account without leaving fringes around anti-aliased lines?考虑 alpha 而不在抗锯齿线周围留下边缘的填充算法?
【发布时间】:2011-08-30 13:53:02
【问题描述】:

我已经实现了一个典型的洪水填充算法,当我使用 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 会在线条周围形成一个难看的光环。

【问题讨论】:

    标签: graphics image-processing antialiasing alphablending flood-fill


    【解决方案1】:

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

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

    【讨论】:

    • 您能解释一下这是如何产生令人满意的结果的吗?对于我的圆和线示例,据我所知,您仍然会使用这种方法在线的中心周围出现边缘,例如如果您替换像素的颜色但将 alpha 保留为 1%,它仍然看起来像一个空像素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多