Ajuste de saturación y ColorFilter a la imagen simultáneamente

La siguiente función cambia el contraste y el brillo de la imagen correctamente.

Bitmap bmp; ImageView alteredImageView; ... public void drawAlteredImage(float contr,float bright) { Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); Canvas canvas = new Canvas(alteredBitmap); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.set(new float[] { contr, 0, 0, 0, bright, 0, contr, 0, 0, bright, 0, 0, contr, 0, bright, 0, 0, 0, 1, 0 }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); Matrix matrix = new Matrix(); canvas.drawBitmap(bmp, matrix, paint); alteredImageView.setImageBitmap(alteredBitmap); } 

Pero cuando agregué el método setSaturation a ColorMatrix, el contraste y la alteración del brillo dejaron de funcionar. El código:

 public void drawAlteredImage(float contr,float bright,float satur) { Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); Canvas canvas = new Canvas(alteredBitmap); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.set(new float[] { contr, 0, 0, 0, bright, 0, contr, 0, 0, bright, 0, 0, contr, 0, bright, 0, 0, 0, 1, 0 }); cm.setSaturation(satur); paint.setColorFilter(new ColorMatrixColorFilter(cm)); Matrix matrix = new Matrix(); canvas.drawBitmap(bmp, matrix, paint); alteredImageView.setImageBitmap(alteredBitmap); } 

En este caso sólo se aplica el efecto de saturación. ¿Por qué ocurre este problema? ¿Cómo puedo arreglarlo?

El setSaturation(...) reemplaza todos los valores de la matriz. Puede crear una matriz que combine ambas operaciones o realizar las operaciones con dos drawBitmap(...) independientes.

Tratar:

 cm.setSaturation(satur); final float m[] = cm.getArray(); final float c = contr; cm.set(new float[] { m[ 0] * c, m[ 1] * c, m[ 2] * c, m[ 3] * c, m[ 4] * c + bright, m[ 5] * c, m[ 6] * c, m[ 7] * c, m[ 8] * c, m[ 9] * c + bright, m[10] * c, m[11] * c, m[12] * c, m[13] * c, m[14] * c + bright, m[15] , m[16] , m[17] , m[18] , m[19] }); 

Otra opción es crear una nueva ColorMatrix, establecer la saturación en esta nueva ColorMatrix, luego llamar a postConcat en la matriz ColorMatrix Brillo / Contraste. Algo como:

 public void drawAlteredImage(float contr,float bright,float satur) { Bitmap alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); Canvas canvas = new Canvas(alteredBitmap); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.set(new float[] { contr, 0, 0, 0, bright, 0, contr, 0, 0, bright, 0, 0, contr, 0, bright, 0, 0, 0, 1, 0 }); ColorMatrix saturationCM = new ColorMatrix(); saturationCM.setSaturation(satur); cm.postConcat(saturationCM); paint.setColorFilter(new ColorMatrixColorFilter(cm)); Matrix matrix = new Matrix(); canvas.drawBitmap(bmp, matrix, paint); alteredImageView.setImageBitmap(alteredBitmap); 

}

  • Detectar los límites de un documento en una imagen usando opencv java
  • Android Asynctask para procesar tramas de video en vivo
  • Obtener el color del píxel tocado desde la vista previa de la cámara
  • ¿Es posible cortar un mapa de bits a piezas pequeñas sin cargar toda la cosa en la memoria?
  • Utilizando el array de bytes de la cámara en bruto para la realidad aumentada
  • Android: creación de un mapa de bits con contenido de SurfaceView
  • Android: BitmapFactory.decodeByteArray ofrece bitmap pixelado
  • Cómo fusionar imágenes e imponerse unas a otras
  • Detección de objetos Android OpenCV
  • Matcher Assertions error error opencv Android
  • Cómo convertir una imagen en escala de grises?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.