ImageViewの画像にグレースケールをかける2017年03月19日(編集2017年03月21日)TweetAndroidアプリ開発でImageViewを使って画像を表示する機会は多いと思います。画像を加工する必要があることもあると思います。この記事は、AndroidアプリでImageViewにグレースケールをかける方法を記載した記事です。中級者向けサンプルコードAndroid-Media-Demoグレースケールグレーススケールは、画像の色の表現方法で、白と黒とその中間の何段階かの灰色のみを使った画像のことです。グレースケール実装Androidでは、グレースケールを実装する方法は2つあります。1つは、ColorFilterを使ってImageViewにフィルターを設定する方法。1つはBitmapオブジェクトのpixelを操作する方法です。この記事では両方の実装方法を説明します。記事の内容を実装後のアプリの動作動画です。ColorFilter実装ImageViewの明るさを調整するために、ImageView#setColorFilterメソッドが用意されています。この方法で画像にカラーフィルタをかけてみましょう。画面のベースになるImageFragmentを作成します。クラス名はImageFragmentにします。ColorMatrixColorMatrixはピクセルの色を変化させるためのクラスです。ColorMatrix();matrix.setSaturation(0);setSaturationメソッドは、色の彩度に影響を与えるように行列を設定します。値0を設定すると、色をグレースケールにマッピングします。ColorMatrixは抽象クラスなので、継承したColorMatrixColorFilterクラスを使います。ColorMatrixColorFilter(matrix);imageView.setColorFilter(filter);imageView#setColorFilterで、カラーフィルターを設定します。ビルド上記のコードビルドして動作を確認します。グレースケール画像にグレースケールが設定されました。画像処理は重い処理なので処理時間も重要です。処理時間を計測しましょう。ColorMatrixを使った処理時間は0msでした。次はグレースケールの単純平均法でImageViewの画像を変更します。YをR,G,Bの平均値とする方法です。Androidに単純平均法の実装ライブラリはないので、直接Bitmapを操作します。mutableBitmapImageViewから取得したBitmapはImmutableです。Immutableは、状態を変更できないオブジェクトです。Immutableのままではgrayscaleを適用できないので、mutableなBitmapを作成します。mutableは、状態を変更できるオブジェクトです。true);Bitmapのコピーを作成することで、mutableなBitmapを作成することができます。Bitmap.Config.ARGB_8888は各ピクセルを4バイトに格納します。具体的には、Alpha/Red/Green/Blueを各8bitで格納します。