Pergunta

Qual seria a maneira certa de transformar uma cor desenhada em uma escala de cinza (para indicar o estado com deficiência)?

EDITAR:
B/w => cinza

Foi útil?

Solução

Sei que essa pergunta foi feita há um tempo atrás, mas me deparei com uma solução mais simples que funciona se você tiver um desenho e você só deseja exibir o mesmo desenhado em escala de cinza. Não há necessidade de ter uma tela ou um pintor ...

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

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);

    drawable.setColorFilter(filter);

    return drawable;
}

Espero que isso também ajude!

Outras dicas

Aparentemente você pode usar o ColorMatrix Classe para fazer qualquer tipo de transformação de espaço de cores. Tem um setSaturation() Método que cria facilmente uma transformação de cor em escala (saturação zero) para você.

Portanto, você pode usar esse filtro para pintar uma nova cópia da imagem. Eu não tentei isso, mas deve funcionar:

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);

Alguns comemos para a resposta de @intgr.
1. Bitmap.Config.ARGB_8888 preservar o canal alfa.
2. Um pequeno código extra:

//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);

Você está querendo fazer isso programaticamente e não apenas com versões desativadas das imagens? Você pode fazer referência a um XML desenhado, algo como:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top