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:
- Usando get () y put () para acceder a valores de píxeles en OpenCV para Java
- Recortar parte particular de la imagen en android
- Convertir un mapa de bits en GrayScale en Android
- Animar la imagen de la cara - usando deformación?
- Android ImageView Vecino más cercano
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?
- OpenCV para ANDROID comparar imagen
- Android flood-fill algoritmo
- Error con setPixels
- Biblioteca de procesamiento de imágenes para Android?
- OpenCV para Android - NativeCameraView todavía existe?
- Transmisión de matriz a rsForEach en Renderscript Compute
- Píxeles de la cámara girados
- Fast Bitmap Blur para Android SDK
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);
}
- Tipface personalizado en android ListView con SimpleAdapter
- Después de la sincronización Repo, no hay archivos en el directorio