android - studio - programa para modificar colores de una imagen
Android: Convertir imagen en color a escala de grises (3)
Esta pregunta ya tiene una respuesta aquí:
- Convertir un mapa de bits a GrayScale en Android 4 respuestas
Hola chicos, necesito su ayuda. Estoy tratando de convertir la imagen en color a escala de grises utilizando el promedio de rojo, verde, azul. Pero sale con errores,
Aqui esta mi codigo
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 ejecuto mi aplicación en el emulador, es forzar el cierre. ¿Alguna idea?
He resuelto mi problema utilizando 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));
}
}
Lalit tiene la respuesta más práctica. Sin embargo , deseaba que el gris resultante fuera el promedio del rojo, el verde y el azul y debería configurar su matriz de la siguiente manera:
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 finalmente, como he enfrentado el problema de convertir una imagen a escala de grises antes, el resultado más agradable visualmente en todos los casos se logra al no tomar el promedio, pero al darle a cada color un peso diferente dependiendo de su brillo percibido, tiendo a usar 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,};
Prueba la solución de esta respuesta anterior por 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;
}
También puedes hacer esto:
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
imageview.setColorFilter(filter);