Android 颜色过滤器 - Porter-Duff 模式

14

我正在尝试解决与 Android ColorFilters 相关的问题。文档非常贫乏,因此主要方法是尝试不同的变量。

问题:

有一个位图。一些像素的 alpha=255,其他像素的 alpha=0。我正在尝试用特定颜色绘制圆形。我希望 alpha 通道在位图中保持不变,但在绘制时,我希望将颜色乘以位图的 alpha。

因此,在绘制圆圈时,我希望 alpha=0 的像素不被绘制,但是 alpha=255 的像素被绘制成我想要的颜色。alpha 通道不应更改。

我正在尝试使用 PorterDuff ColorFilter(Android SDK 中的 PorterDuffColorFilter 类)。

有太多的模式,官方网站上的描述难以理解:http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

我认为我应该使用 DST_ATOPSRC_ATOP,但它们的工作方式与我描述的不同。

此外,在 porter-duff 颜色过滤器的构造函数中存在奇怪的参数 srcColor

我无法理解公式 [Da,Sc * Da +(1-Sa)* Dc] 中的“Sa”和“Sc”的含义。它可以来自传递到 colorfilter 构造函数中的颜色,也可以是由 "paint.setColor" 设置的颜色。

有人知道这是如何工作的吗?


你可以谷歌“波特杜夫”来了解这些模式的含义。 - Renard
1
这个很棒的文档用图片解释了PorterDuff模式:http://ssp.impulsetrain.com/porterduff.html。只需要注意它不像安卓一样添加“src_”前缀,所以“IN”等同于“SRC_IN”。 - user3467994
3个回答

10

SaSc分别是"源透明度(source alpha)"和"源颜色(source color)"的缩写。在PorterDuffColorFilter构造函数中,srcColor参数用于设置这些值的颜色。

对于您的情况,Mode.MULTIPLY可能是最合适的选择。


但是paint.setColor如何影响它呢?我尝试改变它并且发现它确实有影响!我认为它应该在这样的混合公式中? - Alexander Taran
此外,在这种情况下,乘法模式无效。带有零阿尔法通道的像素也会被绘制 :( - Alexander Taran
我不是完全确定这一部分,但我认为如果你给你的画笔设置了颜色,这个值会在某个时候被包含在src/dst参数中。在你的情况下,颜色alpha似乎也参与了计算,使得所有东西都成为了一个实心的1.0-alpha。你应该尝试在不设置画笔颜色的情况下绘制位图。 - Jave
嗯...“Da”是目标阿尔法吗-位图的阿尔法通道,我正在尝试绘制它(确切地说,我在位图上创建画布并在该画布上绘制)? - Alexander Taran
是的,我认为是这样。但是这个值也有可能受到你的颜色影响,这并不是不可能的。 - Jave

5
请注意,Porter-Duff模式仅在使用预乘alpha时才能正常工作。这意味着R、G或B分量中没有一个可以超过alpha值。
Android项目的GitHub项目展示了所有Porter-Duff模式。该Android应用程序也可在Playstore上获得。

应用程序漂亮地展示了公式对图像的影响,如果您能提供一些更简单的图像选项,效果会更好。 - Richard Le Mesurier

1
经过一些研究,我得出了以下关于Android中PorterDuff颜色模式的结论:
  • Sa和Sc是源Alpha和源颜色,例如,如果我将ColorFilter设置为像myDrawable.setColorFilter(desiredColor,Mode.SRC_ATOP)这样的可绘制对象,则Sa和Sc值将从desiredColor而不是myDrawable中获取。Da和Dc将是myDrawable的原始alpha和颜色值。
  • 我有一个图像,我想使用用户输入的某些带有alpha值的颜色。我尝试使用PorterDuff模式,我的原始myDrawable是一个九宫格可绘制对象,它具有透明背景和类似于消息气泡三角形的三角形角落。当我使用

    public static final PorterDuff.Mode SRC [Sa,Sc]

应用源颜色和源Alpha,我假设上述setColorFilter方法desiredColor的颜色和Alpha值,我得到了正确的颜色值,即颜色和Alpha正确应用于新的可绘制对象,但是图像上的三角形完全被洗掉/删除了。因此,我不得不使用ColorMatrixFilter并设置矩阵并将alpha值单独设置为可绘制对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接