28

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

編集:
白黒 => グレースケール

4

4 に答える 4

106

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

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

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);

    drawable.setColorFilter(filter);

    return drawable;
}

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

于 2011-02-09T23:35:02.283 に答える
18

どうやら、このクラスを使用して、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);
于 2009-11-24T22:35:24.497 に答える
2

@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);
于 2009-11-30T00:11:13.140 に答える
1

イメージの無効なバージョンだけでなく、プログラムでこれを具体的に実行したいですか? 次のような 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>
于 2009-11-24T23:38:52.007 に答える