web-dev-qa-db-ja.com

ドローアブル=>グレースケール

Drawableの色を(無効な状態を示すために)グレースケールのものに変える正しい方法は何でしょうか?

編集:
B/W =>グレースケール

24
yanchenko

この質問が少し前に行われたことは知っていますが、Drawableがあり、同じDrawableをグレースケールで表示したい場合に機能するより簡単なソリューションに出くわしました。キャンバスやペインターを持っている必要はありません...

protected Drawable convertToGrayscale(Drawable drawable)
{
    ColorMatrix matrix = new ColorMatrix();
    matrix.setSaturation(0);

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);

    drawable.setColorFilter(filter);

    return drawable;
}

これもお役に立てば幸いです。

101
Justin

どうやら、ColorMatrixクラスを使用して、あらゆる種類の色空間変換を行うことができます。 setSaturation()メソッドがあり、カラーからグレースケールへの変換(彩度をゼロにする)を簡単に作成できます。

したがって、そのフィルターを使用して、画像の新しいコピーをペイントできます。私はこれを試していませんが、うまくいくはずです:

Bitmap grayscaleBitmap = Bitmap.createBitmap(
    colorBitmap.getWidth(), colorBitmap.getHeight(),
    Bitmap.Config.RGB_565);

Canvas c = new Canvas(grayscaleBitmap);
Paint p = new Paint();
ColorMatrix cm = new ColorMatrix();

cm.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(cm);
p.setColorFilter(filter); 
c.drawBitmap(colorBitmap, 0, 0, p);
17
intgr

@intgrの答えに対するいくつかのコメント。
1。 Bitmap.Config.ARGB_8888アルファチャネルを保持します。
2。少し余分なコード:

//remember, you are converting a .png image, as opposed to a Drawable defined in .xml  
Bitmap colorBitmap = ((BitmapDrawable)drawable).getBitmap();    
// the code by intgr  
Drawable grayscaleDrawable = new BitmapDrawable(grayscaleBitmap);
2
yanchenko

無効にしたバージョンの画像だけでなく、プログラムでこれを実行したいですか?次のようなXMLドローアブルを参照できます。

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_window_focused="false" Android:state_enabled="true"
        Android:drawable="@drawable/btn_default_normal" />
    <item Android:state_window_focused="false" Android:state_enabled="false"
        Android:drawable="@drawable/btn_default_normal_disable" />
    <item Android:state_pressed="true" 
        Android:drawable="@drawable/btn_default_pressed" />
    <item Android:state_focused="true" Android:state_enabled="true"
        Android:drawable="@drawable/btn_default_selected" />
    <item Android:state_enabled="true"
        Android:drawable="@drawable/btn_default_normal" />
    <item Android:state_focused="true"
        Android:drawable="@drawable/btn_default_normal_disable_focused" />
    <item
         Android:drawable="@drawable/btn_default_normal_disable" />
</selector>
1
Jeremy Logan