Android ColorFilter - Porter-Duff模式

时间:2012-04-20 11:50:35

标签: android colors filter porter-duff colorfilter

我正在尝试解决android ColorFilters的问题。文档很差,所以主要方法是尝试不同的变体。

问题:

有一个位图。一些像素具有alpha = 255,其他像素具有alpha = 0。我正在尝试绘制一个具有特定颜色的圆圈。我想在位图中不改变alpha通道,但在绘图时我想将颜色乘以位图-α。

因此,在绘制圆形时,我希望不绘制alpha = 0的像素,但是alpha = 255的像素要绘制我想要的颜色。 Alpha通道不应该改变。

我正在尝试使用porter-duff ColorFilter(android sdk中的PorterDuffColorFilter类)。

官方网站上有太多模式和不可理解的说明:http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

我想我应该使用DST_ATOPSRC_ATOP,但它们不能像我描述的那样工作。

此外,在porter-duff colorfilter的构造函数中有一个奇怪的参数srcColor

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

有人知道,它是如何运作的?

3 个答案:

答案 0 :(得分:10)

SaSc分别是“源alpha”和“源颜色”的短路。 srcColor构造函数中的PorterDuffColorFilter参数是用于这些值的颜色。

对于您的情况,Mode.MULTIPLY可能效果最佳。

答案 1 :(得分:5)

请注意,Porter-Duff模式仅定义为与预乘alpha一起正常工作。这意味着R,G或B组件都不能超过alpha值。

GitHub project用于展示所有Porter-Duff模式的Android项目。 Playstore上也提供Android App

答案 2 :(得分:1)

经过一番研究后,我得出了关于Android中PorterDuff Color模式的结论,

  • Sa和Sc是源Alpha和源颜色, 例如如果我将ColorFilter设置为像myDrawable.setColorFilter(desiredColor,Mode.SRC_ATOP)这样的drawable,则Sa和Sc值将从desiredColor中获取,而不是从myDrawable中获取。 Da和Dc将是myDrawable的原始alpha和颜色值。
  • 我有一个图像,我想要使用来自用户输入的alpha值应用某些颜色。我尝试使用PorterDuff模式,我的原始myDrawable是一个九个可绘制的补丁,它有透明的背景和trangular角落,如消息气泡三角形。我用的时候

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

应用了源颜色和源Alpha,我认为上面的setColorFilter方法desiredColor的颜色和Alpha值,我得到的颜色值正确,即颜色和alpha正确应用于新的Drawable,但该图像上的三角形被完全清洗/移除。 所以我不得不使用ColorMatrixFilter并设置矩阵并将alpha值分别设置为drawable。