2012-02-19 6 views
1

これはAndroidアプリケーション向けです。のは、私はどのように私はカラー1を有する層の上にカラー2を有する層の複合色をアルファとの2色2色の合成色を計算する(オーバー演算子)

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

を計算するかしているとしましょうか?

私はここでディスカッションと数式を見つけましたが、自分のコードを書く前にAndroidやJavaで既に利用可能かどうかを最初に確認しました。

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

編集:質問の目的は、ビットマップが、色(例えばaarrggbb int型)で終了していないことに注意してください。

答えて

1

私が何をしたいことはPorterDuffColorFilterで使用PorterDuff.Mode.Multiply

...かもしれないと思います。

EDIT:実際には、デスティネーションカラーが「オーバー」ソースカラーの場合は、DST_OVERモードが必要です。

+0

ありがとうございました。コンポジットカラーの計算にどのように使用すればよいですか?あなたは単一のピクセルビットマップを描画し、そのピクセルを読み取る必要がありますか? – user1139880

+0

ああ、ねえ。私はそれより良い方法を知らない。 – nmr

0
+0

Androidプラットフォームからjavax.mediaを入手できますか? – nmr

+0

複合カラー値はどのようにして取得できますか?私は単一のピクセルビットマップを描画し、そのピクセルを読み取る必要がありますか – user1139880

4

私はそれを実装することになりました。 Wikipedia式の直接書き直し。この の実装に問題はありますか?

// 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); 
} 
関連する問題