我正在尝试使用你在Gimp或Photoshop中找到的涂抹工具。我尝试过很多变化,但都有问题。我试图在图像上从位置P1弄湿到P2的基本方法是:
它看起来很好并且按预期涂抹,但我遇到的主要问题是污迹似乎使事情变得更暗。特别是当使用较小的刷子间距时,重复涂抹将使该区域变为黑色。关于我做错了什么或者我可以看一些标准算法的任何建议?我已经看过Gimp的来源,但很难跟进。
如果重要的话,我正在使用移动设备(Android,Java),所以最好快点。
答案 0 :(得分:3)
我怀疑你的算法不断地将你的矩形渲染到彼此之上,可能会对它们的值进行平均以获得下面的新颜色值。根据您的程序细节的设置方式,我会打赌由于重复平均,RGB值将达到0x000000。这也解释了为什么较小的步距变黑更快,因为更多的步骤相当于更多的平均值。我有一个类似的问题,颜色变换器在边缘反复模糊变黑。
有关创建自己的涂抹工具的详细教程,请访问:http://losingfight.com/blog/2007/09/04/how-to-implement-smudge-and-stamp-tools/
不幸的是,这些例子都在Objective-C中,但文本很好地解释了发生了什么。
希望这有帮助。
答案 1 :(得分:1)
你的问题是Android使用预乘alpha作为位图。 Alpha通道与RGB相乘以节省合成时间。
这是问题的一个例子。这两个画笔完全相同,除了底部以5%alpha渲染。
在创建涂抹工具时,如何进入该涂层是污迹渲染非常低的alpha像素(通常来自遮罩效果,或简单地来自原始位图本身)。当许多这些位图呈现在彼此之上时(如在涂抹中),它变为灰色。
我在构建涂抹工具以及我正在为Android编写的照片编辑应用程序时遇到了这个错误,我很遗憾没有找到一个好的解决方案。
alpha和rgb通道需要在不透明的位图中单独渲染,然后以某种方式重新组合。不幸的是,目前在Android中似乎没有好办法。
如果你想出一个解决方案,我很乐意听到它。希望这能为您提供有关问题原因的一些信息,也许还有一些修复的灵感。
答案 2 :(得分:0)
相当老的话题,但我发现自己有同样的问题(涂抹去黑色)。我也在关注本教程:
正如GuyNoir所提到的,问题是android中位图的预乘alpha,其中存储在内存中的颜色值已经乘以alpha值。顺便说一下,模糊以暗晕的形式出现同样的问题。
使用canvas API无法解决这个问题,因为:
"视图系统或Canvas只能绘制预乘的位图。"
所以我们必须通过Bitmap#getPixels()提取像素并手动进行混合。这肯定会对性能产生影响,但实施起来并不难。
所以对于每个像素:
alpha = ( SourceAlpha * strength ) + ( DestinationAlpha * ( 1 - strength ) )
color = ( SourceColor * strength ) + ( DestinationColor * ( 1 - strength ) )
目的地是要污点的图像,而源是画笔。 力量代表你对涂抹刷的压力有多大。