2011-12-05 11 views
24

Ciao ragazzi ho bisogno del vostro aiuto, sto cercando di convertire un'immagine a colori in scala di grigi usando la media di rosso, verde, blu. Ma si esce con gli errori,Android: Convertire un'immagine a colori in scala di grigi

Ecco il mio codice

imgWidth = myBitmap.getWidth(); 
imgHeight = myBitmap.getHeight(); 

for(int i =0;i<imgWidth;i++) { 
    for(int j=0;j<imgHeight;j++) { 
    int s = myBitmap.getPixel(i, j)/3; 
    myBitmap.setPixel(i, j, s); 
    } 
} 

ImageView img = (ImageView)findViewById(R.id.image1); 
img.setImageBitmap(myBitmap); 

Ma quando eseguo il mio applicazione su emulatore, è la forza vicino. Qualche idea?

Ho risolto il mio problema utilizzare il seguente codice:

for(int x = 0; x < width; ++x) { 
      for(int y = 0; y < height; ++y) { 
       // get one pixel color 
       pixel = src.getPixel(x, y); 
       // retrieve color of all channels 
       A = Color.alpha(pixel); 
       R = Color.red(pixel); 
       G = Color.green(pixel); 
       B = Color.blue(pixel); 
       // take conversion up to one single value 
       R = G = B = (int)(0.299 * R + 0.587 * G + 0.114 * B); 
       // set new pixel color to output bitmap 
       bmOut.setPixel(x, y, Color.argb(A, R, G, B)); 
      } 
     } 
+1

Che cos'è il registro degli errori del post di errore. – user370305

+0

Hai riscontrato errori esatti nel registro? come lo stackoverflow? – doNotCheckMyBlog

risposta

29

provare la soluzione from this previous answer by leparlon:

public Bitmap toGrayscale(Bitmap bmpOriginal) 
    {   
     int width, height; 
     height = bmpOriginal.getHeight(); 
     width = bmpOriginal.getWidth();  

     Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
     Canvas c = new Canvas(bmpGrayscale); 
     Paint paint = new Paint(); 
     ColorMatrix cm = new ColorMatrix(); 
     cm.setSaturation(0); 
     ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
     paint.setColorFilter(f); 
     c.drawBitmap(bmpOriginal, 0, 0, paint); 
     return bmpGrayscale; 
    } 
+1

Come posso anche schiarire l'immagine? L'immagine è ora grigia, ma è anche scura a causa dei colori nell'immagine originale. – Andrew

+0

quindi, dopo averlo convertito in bianco e nero, le dimensioni dell'immagine saranno ridotte? (dimensione in kb) –

+0

Lalit puoi dirmi come possiamo estrarre il carattere dall'immagine in scala di grigi? –

11

Lalit ha la risposta più pratica. Tuttavia, si voleva il conseguente grigia per essere la media del rosso, verde e blu e dovrebbe impostare la matrice in questo modo:

float oneThird = 1/3f; 
    float[] mat = new float[]{ 
      oneThird, oneThird, oneThird, 0, 0, 
      oneThird, oneThird, oneThird, 0, 0, 
      oneThird, oneThird, oneThird, 0, 0, 
      0, 0, 0, 1, 0,}; 
    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(mat); 
    paint.setColorFilter(filter); 
    c.drawBitmap(original, 0, 0, paint); 

E, infine, come ho affrontato il problema di conversione di un'immagine a in scala di grigi, prima - il risultato più visivamente piacevole in tutti i casi si ottiene non prendendo la media, ma attraverso dando ogni colore peso diverso a seconda della sua luminosità percieved, tendo a usare questi valori:

float[] mat = new float[]{ 
      0.3f, 0.59f, 0.11f, 0, 0, 
      0.3f, 0.59f, 0.11f, 0, 0, 
      0.3f, 0.59f, 0.11f, 0, 0, 
      0, 0, 0, 1, 0,}; 
+0

@ user1324936 cura di elaborare? – Jave

65

si può fare questo anche:

ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
    imageview.setColorFilter(filter); 
+0

È possibile renderlo solo full-black (0xff000000) e full-white (0xffffffff)? –

+0

@androiddeveloper È possibile farlo con il metodo setColorFilter (color, mode) incorporato di ImageView o con un normale PorterDuffColorFilter. http://developer.android.com/reference/android/graphics/PorterDuffColorFilter.html – Pkmmte

+0

@Pkmmte Qual è il normale PorterDuffColorFilter? –

Problemi correlati