0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ColorMatrixColorFilterを使って画像の色を加工して表示する

Posted at

昔からあるのに知らなかったシリーズ

ImageViewではColorFilterを設定して色を変更することができます。
ColorFilterとして色を設定する場合、内部的にはPorterDuffColorFilterが使われ、Tintで指定するのと同様にアルファチャンネルを除いてすべて同じ色に塗りつぶされます(PorterDuff.Modeを指定しない場合)
アイコンに着色する目的で使う場合は、Tintを指定する場合がほとんどで、使われる機会も減っているように思います。

このColorFilterにはほかにもバリエーションがあり、ColorMatrixColorFilterもその一つです。

ColorMatrixColorFilterはその名の通り、ColorMatrixを使って、色を変換して表示することができます。

ColorMatrixはリンク先に説明がありますが、4x5の行列で定義します。

  [ a, b, c, d, e,
    f, g, h, i, j,
    k, l, m, n, o,
    p, q, r, s, t ]

これをもとの色のRGBAに対して以下の計算を行い、色の変換を行います。

   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;

API Level1からある仕組みです

変化なし

これを設定する意味は全くありませんが、変換の仕組みを確認するために何も変化が起こらない行列を指定してみます。
以下の指定をすると、元の色のRGBAをそのまま採用することになるので、何も変化が起こりません。

imageView.colorFilter = ColorMatrixColorFilter(
    floatArrayOf(
        1f, 0f, 0f, 0f, 0f,
        0f, 1f, 0f, 0f, 0f,
        0f, 0f, 1f, 0f, 0f,
        0f, 0f, 0f, 1f, 0f,
    )
)

R' = R
G' = G
B' = B
A' = A
という変換で変化なしとなります。

ネガ・ポジ反転

RGBに-1をかけ、255から引く形の行列を指定するとネガポジ反転した色で表示させることができます。

imageView.colorFilter = ColorMatrixColorFilter(
    floatArrayOf(
        -1f, 0f, 0f, 0f, 255f,
        0f, -1f, 0f, 0f, 255f,
        0f, 0f, -1f, 0f, 255f,
        0f, 0f, 0f, 1f, 0f,
    )
)

R' = 255 - R
G' = 255 - G
B' = 255 - B
A' = A
という変換ですね。

元画像 colorFilter指定

グレースケール変換

RGB各色を計算して輝度を計算します。輝度計算の係数は色空間によって異なりますが、ITU-R BT.709/sRGBの場合、0.2126, 0.7152, 0.0722が使われます。これをRGBで同じ値を指定するとグレースケール変換ができます。

imageView.colorFilter = ColorMatrixColorFilter(
    floatArrayOf(
        0.2126f, 0.7152f, 0.0722f, 0f, 0f,
        0.2126f, 0.7152f, 0.0722f, 0f, 0f,
        0.2126f, 0.7152f, 0.0722f, 0f, 0f,
        0f, 0f, 0f, 1f, 0f,
    )
)

R' = 0.2126R + 0.7152G + 0.0722B
G' = 0.2126R + 0.7152B + 0.0722G
B' = 0.2126R + 0.7152B + 0.0722G
A' = A

元画像 colorFilter指定

あくまで係数と定数だけなので複雑な計算はできませんが、ちょっとした加工をしての表示はできそうですね。特にディスエーブル表示でグレースケール表示したいなどは普通にあるユースケースかと思います。

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?