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



这是针对Android应用程序的。假设我有两种带有alpha 的颜色

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

如何计算color2的层与color1的层的组合颜色?

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

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

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

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

// 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);
}

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

与PorterDuffColorFilter一起使用。

编辑:实际上,也许你想要DST_OVER模式的目的地颜色"超过"源颜色。

它是Java Advanced Imaging API的一部分:

http://download.java.net/media/jai/javadoc/1.1.3/jai-apidocs/javax/media/jai/operator/CompositeDescriptor.html

http://www.oracle.com/technetwork/java/current-142188.html

最新更新