为什么我的涂抹图像算法会使图像变暗?

时间:2010-10-22 01:11:41

标签: java android graphics opengl-es

我正在尝试编写一个图形效果,其中一个圆圈围绕一个图像随着图像弄脏图像(就像Gimp或Photoshop中的涂抹工具的工作方式)。我正在使用的基本算法是:

  1. 圆圈从位置A移动到位图
  2. 上的位置B.
  3. 将位置A的像素圆复制到临时位图
  4. 使用大约50%的alpha将这个像素圈从临时位图绘制到位置B.
  5. 这样可以正常工作,看起来就像我期望的那样,如果圆圈在图像上一次移动1个像素,图像看起来会变得模糊。

    我现在想为涂抹效果添加一些纹理。我有一个位图,其中包含一个油漆blob的图片。上面的算法被修改为以下内容,因此污迹采用了这个油漆斑点的形状:

    1. 和以前一样
    2. 使用paint blob纹理替换临时位图像素,然后将位置A的像素圆复制到临时位图中,但只保留与paint blob像素匹配的像素(即使用Porter-Duff“source in destination”模式将圆圈绘制到临时位图时。)
    3. 和以前一样
    4. 这几乎可以正常工作,看起来它最初很好,但逐渐涂抹使我的图像中的颜色变暗!如果圆圈经过多次相同的区域,颜色最终会变为黑色。我有什么想法可能做错了吗?

      我在Android中实现了上述功能。我发现这个帖子关于Android中的位图(比如我的油漆blob纹理)加载了“预乘alpha”,作者说这会导致他的图像因为它而变得更暗: http://www.kittehface.com/2010/06/androidbitmap-and-premultiplied-alpha.html

      我怀疑我遇到了类似的问题,但我不明白发生了什么,并且不知道如何修复它。有没有人对可能发生的事情有所暗示?

1 个答案:

答案 0 :(得分:2)

乍一看,图像变暗的原因是前三个步骤中的#3。您将像素覆盖在现有像素上的50%。您可能需要考虑使用原始像素值和新像素值的平均值。您可能想要研究一些模糊算法。