计算两种颜色的组合颜色(Over运算符)

这适用于Android应用程序。 让我们说我有两种颜色的alpha

int color1 = 0x12345678 // aarrggbb int color2 = 0x87654321 

如何在具有color1的图层上计算图层与color2的组合颜色?

我在这里找到了一个讨论和公式,但是在编写我自己的代码之前,首先检查它是否已经在Android和/或Java中可用。

http://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator

编辑:请注意问题的目标不是以位图结束而是以颜色结束(例如aarrggbb int)。

我想你想要的可能是PorterDuff.Mode.Multiply

…与PorterDuffColorFilter一起使用 。

编辑:其实也许你想要模式DST_OVER目标颜色“超过”源颜色。

我最终实现了它。 直接重写维基百科公式。 这个实现有什么问题吗?

 // a2 over a1 private static int compositeAlpha(int a1, int a2) { return 255 - ((255 - a2) * (255 - a1)) / 255; } // For a single R/G/B component. a = precomputed compositeAlpha(a1, a2) private static int compositeColorComponent(int c1, int a1, int c2, int a2, int a) { // Handle the singular case of both layers fully transparent. if (a == 0) { return 0x00; } return (((255 * c2 * a2) + (c1 * a1 * (255 - a2))) / a) / 255; } // argb2 over argb1. No range checking. public static int compositeColor(int argb1, int argb2) { final int a1 = Color.alpha(argb1); final int a2 = Color.alpha(argb2); final int a = compositeAlpha(a1, a2); final int r = compositeColorComponent(Color.red(argb1), a1, Color.red(argb2), a2, a); final int g = compositeColorComponent(Color.green(argb1), a1, Color.green(argb2), a2, a); final int b = compositeColorComponent(Color.blue(argb1), a1, Color.blue(argb2), a2, a); return Color.argb(a, r, g, b); }