その10 ColorFilterの効果
 その7でPorterDuff.Modeを使って単色のBitmapの色を変えて描画してみましたが、使用するBitmapが単色であることはあまり無いと思いますので、1つのBitmapを色味をいろいろと変えて使用したいならばやはりColorFilterを使うことになると思います。android.graphics.ColorFilterのサブクラスとしてColorMatrixColorFilter、 LightingColorFilter、 PorterDuffColorFilterクラスが用意されています。 PorterDuffColorFilterは合成ルールを指定するPorterDuff関連のFilterなのでここでは扱いません。単純に色味を変更するFilterであるColorMatrixColorFilterとLightingColorFilterについて見てみたいと思います。
 まずColorMatrixColorFilterですが、こちらは色変更用のパラメータとしてColorMatrixクラスのインスタンスが必要になります。ColorMatrixクラスは20個の要素を持つfloat型配列と同義と考えていいと思います。実際ColorMatrixColorFilterのインスタンスを作成する時は、引数としてColorMatrixを指定する他に、直接20個の要素を持つfloat型配列を指定することもできます。さて20個もパラメータが必要となるとかなり複雑な感じを受けますが、ColorMatrixの公式リファレンスを見てみると、

ColorMatrixの20個の要素 [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]
元のBitmapのカラー値 [R,G,B,A]

の場合、Filter適用後のBitmapのカラー値 [R',G',B',A']は

R' = a*R + b*G + c*B + d*A + e
G' = f*R + g*G + h*B + i*A + j
B' = k*R + l*G + m*B + n*A + o
A' = p*R + q*G + r*B + s*A + t

となっています。適用後のARGB要素のそれぞれが、適用前の元のARGBの値とパラメータを掛け合わせたものと定数の和になっています。これは、パラメータは多いですが感覚的にわかりやすい形になっていると思います。
 次にLightingColorFilterについてですが、Filterについて調べようと思ったのは実はこちらの使い方がよくわからなかったためです。LightingColorFilterはColorMatrixColorFilterほど多くのパラメータを持たず、コンストラクタは

LightingColorFilter(int mul, int add)

の1種類のみで、指定する引数もたった2つです。公式リファレンスを見ると、元のBitmapの各RGB要素に第1引数を乗算し、それから第2引数を加算する(結果は0〜255の整数に調整される)Filterとなるようです。またアルファ要素は無視されるとありますので、単純にカラー値のみに適用されるFilterのようです。しかし加算部分はいいとして、乗算に使う第1引数もint型の整数であり、細かな調整をするのが難しいのではないかと感じます。例えば元のRGB値が64の場合を考えると、結果が0〜255に収まるようにするには、int型引数mulは0、1、2、3、そして4以上の値の5パターン(1の時は元と変わらないので実際には4パターン)しか取れず、ずいぶん大雑把な色変更になってしまいます。そこで調べてみたところ、引数は2つともint型になっていますが実際にはColor型でRGB別に0〜255の値を指定する必要があることがわかりました。確かにそうでなければRGBの値を同じ値しか変化させることができず使い物にならないですよね・・・。アルファは無視されるのでColor.rgb()で指定してやるとよいと思います。そして先に述べた第1引数の乗算部分ですが、実際に試してみると引数の数値がそのまま乗算されるのではなく、引数の数値/255が乗算されるようです。また第2引数の加算部分は素直にそのままの値が加算されるようです。よってFilter適用後のカラーは、

元のBitmapのカラー値 [R,G,B]に対して

LightingColorFilter(int mul, int add)
mul = Color.rgb(a,b,c)
add = Color.rgb(d,e,f)  a,b,c,d,e,f は0〜255

のFilterを適用した後のカラー値 [R',G',B']は

R' = R * a/255 + d
G' = G * b/255 + e
B' = B * c/255 + f

と、なります。引数mulとaddがColor型であることから必然的にa、b、c、d、e、fは0〜255になりますので、第1引数mulでは255を指定した時に乗算の係数が1となり適用後の色は元の色を維持すると同時にそれが一番明るい状態であり、値を小さくするにつれ適用後の色は暗くなっていきます。第2引数addは負の値が取れないことから、0を指定した時に適用後の色は元の色を維持すると同時にそれが一番暗い状態であり、値が増えるにつれ適用後の色は明るくなっていきます。こうして見るとLightingColorFilterは指定するパラメータが少ない分簡単に使えそうに見えますが、ColorMatrixColorFilterと比べて乗算部分の係数が1以下の値しか取れず、加算部分の定数は正の値しか取れない制限により、色を明るくするには定数の加算部分のみで行わなければならず、暗くするためには255分率の少数乗算部分のみで行わなければならないという具合に少々使い勝手が悪いものになっています。特定の色味だけを乗算部分で弱くしたり、定数加算部分でより明るい色にする分には使えるかもしれません。
ご意見ご感想等は

まで








inserted by FC2 system