2011-12-05 20 views
24

Hola chicos, necesito su ayuda, estoy tratando de convertir la imagen en color en escala de grises usando el promedio de rojo, verde, azul. Pero sale con errores,Android: Convertir imágenes en color a escala de grises

Aquí está mi código

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

Pero cuando corro mi aplicación en el emulador, es fuerza de cierre. ¿Alguna idea?

he resuelto mi problema, utilice el siguiente código:

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

¿Cuál es el mensaje de error de registro de errores. – user370305

+0

¿Tiene algún error exacto en el registro? como stackoverflow? – doNotCheckMyBlog

Respuesta

29

pruebe la solución 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

¿Cómo puedo también aclarar la imagen? La imagen ahora es gris, pero también es oscura debido a los colores en la imagen original. – Andrew

+0

entonces, después de convertirlo a blanco y negro, ¿se reducirá el tamaño de la imagen? (tamaño en kb) –

+0

Lalit ¿me puede decir cómo podemos extraer el carácter de la imagen en escala de grises? –

11

Lalit tiene la respuesta más práctica. Sin embargo, que querían que el resultante de color gris a ser el promedio de los colores rojo, verde y azul y debe configurar su matriz de este 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); 

Y, por último, como ya he enfrentado al problema de convertir una imagen para Escala de grises antes - el resultado más agradable a la vista en todos los casos se logra al no tomar la media, pero a través de dar cada color peso diferente en función de su brillo percibida, que tienden a utilizar estos valores:

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 cuidado para elaborar? – Jave

65

Usted puede hacer esto también:

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

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

¿Es posible hacerlo solo completamente negro (0xff000000) y blanco completo (0xffffffff)? –

+0

@androiddeveloper Puede hacerlo con el método setColorFilter (color, modo) integrado de ImageView o con un PorterDuffColorFilter regular. http://developer.android.com/reference/android/graphics/PorterDuffColorFilter.html – Pkmmte

+0

@Pkmmte ¿Cuál es el habitual PorterDuffColorFilter? –

Cuestiones relacionadas