Convertir mapa de bits en sepia en android
¿Hay alguna forma de convertir un mapa de bits en sepia? Sé que para convertir a grayScale es establecer la setSaturation en ColorMatrix. Pero ¿qué pasa con Sepia?
- Obtenga los metadatos de la imagen - Android
- Cargar foto en la galería como objeto de mapa de bits en Android
- Seleccionar miniatura de la galería de Android
- Cómo establecer bitmap en mapa de bits existente como su fondo
- Bordes dentados en imágenes presentadas en Android
- Cómo crear un ImageView circular en Android?
- Excepción de punto nulo en IMageSwitcher.setImageResource ()
- Cómo borrar un ImageView en Android?
- ImageView: escala imágenes demasiado grandes hacia abajo, no escala imágenes demasiado pequeñas
- ¿Cómo puedo añadir dinámicamente imágenes a un GridView?
- Las imágenes de Android me confunden
- Formatos soportados por BitmapFactory.decodeByteArray (...)
- ¿Cómo obtengo el identificador de recurso de una imagen si conozco su nombre?
Si tiene instancia de imagen, puede utilizar ColorMartix para dibujarla en Sepia. Permítanme describir cómo se puede hacer esto usando Drawable.
public static void setSepiaColorFilter(Drawable drawable) { if (drawable == null) return; final ColorMatrix matrixA = new ColorMatrix(); // making image B&W matrixA.setSaturation(0); final ColorMatrix matrixB = new ColorMatrix(); // applying scales for RGB color values matrixB.setScale(1f, .95f, .82f, 1.0f); matrixA.setConcat(matrixB, matrixA); final ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrixA); drawable.setColorFilter(filter); }
El proyecto de ejemplo se trasladó de Bitbucket a GitHub . Por favor, consulte la sección de liberación para descargar el binario APK para probar sin compilar.
Sé la respuesta, pero tal vez si algunos tienen otra solución mejor ..
public Bitmap toSephia(Bitmap bmpOriginal) { int width, height, r,g, b, c, gry; height = bmpOriginal.getHeight(); width = bmpOriginal.getWidth(); int depth = 20; Bitmap bmpSephia = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmpSephia); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setScale(.3f, .3f, .3f, 1.0f); ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); paint.setColorFilter(f); canvas.drawBitmap(bmpOriginal, 0, 0, paint); for(int x=0; x < width; x++) { for(int y=0; y < height; y++) { c = bmpOriginal.getPixel(x, y); r = Color.red(c); g = Color.green(c); b = Color.blue(c); gry = (r + g + b) / 3; r = g = b = gry; r = r + (depth * 2); g = g + depth; if(r > 255) { r = 255; } if(g > 255) { g = 255; } bmpSephia.setPixel(x, y, Color.rgb(r, g, b)); } } return bmpSephia; }
He mejorado la respuesta del OP . Esto funciona competitivamente rápido cuando se compara con el método ColorMatrix
, pero produce un tono marrón más agradable. (en mi opinión)
public Bitmap toSepiaNice(Bitmap color) { int red, green, blue, pixel, gry; int height = color.getHeight(); int width = color.getWidth(); int depth = 20; Bitmap sepia = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); int[] pixels = new int[width * height]; color.getPixels(pixels, 0, width, 0, 0, width, height); for (int i = 0; i < pixels.length; i++) { pixel = pixels[i]; red = (pixel >> 16) & 0xFF; green = (pixel >> 8) & 0xFF; blue = pixel & 0xFF; red = green = blue = (red + green + blue) / 3; red += (depth * 2); green += depth; if (red > 255) red = 255; if (green > 255) green = 255; pixels[i] = (0xFF << 24) | (red << 16) | (green << 8) | blue; } sepia.setPixels(pixels, 0, width, 0, 0, width, height); return sepia; }
- Bad convertView type BaseAdapter de ListView
- Android Studio – ProGuard "java.io.IOException … bin \ classes (Ningún archivo o directorio)"