【发布时间】:2011-04-28 22:28:12
【问题描述】:
我正在尝试编写一个图形效果,其中一个圆圈围绕图像移动,随着图像的移动而涂抹图像(就像 Gimp 或 Photoshop 中涂抹工具的工作方式一样)。我使用的基本算法是:
- 圆在位图上从位置 A 移动到位置 B
- 将一圈像素从位置 A 复制到临时位图中
- 使用大约 50% 的 alpha 将这个像素圈从临时位图绘制到位置 B。
这很好用,看起来就像我所期望的那样,如果圆圈在图像上一次移动 1 个像素,图像看起来会被弄脏。
我现在想为涂抹效果添加一些纹理。我有一个包含油漆斑点图片的位图。上面的算法被修改为以下,所以污迹采用了这个油漆斑点的形状:
- 和以前一样
- 用油漆斑点纹理替换临时位图像素,然后将像素圈从位置 A 复制到临时位图中,但只保留与油漆斑点像素匹配的像素(即使用 Porter-Duff“目标中的源”模式将圆圈绘制到临时位图中时)。
- 和以前一样
这几乎可以正常工作,最初看起来还不错,但逐渐弄脏会使我图像中的颜色变暗!如果圆圈多次经过同一区域,颜色最终会变为黑色。有什么想法我可能做错了吗?
我已经在 Android 中实现了上述功能。我偶然发现了这篇关于 Android 中的位图(比如我的油漆斑点纹理)加载了“预乘 alpha”的帖子,作者说这导致他的图像因此变得更暗: http://www.kittehface.com/2010/06/androidbitmap-and-premultiplied-alpha.html
我怀疑我遇到了类似的问题,但我不明白发生了什么,也不知道如何解决它。有没有人暗示可能会发生什么?
【问题讨论】:
标签: java android graphics opengl-es