una studio programacion programa para móviles modificar imagenes imagen grises fotos escala desarrollo definicion curso colores cambiar app aplicaciones android grayscale

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í:

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