Cambiar el color del mapa de bits
Estoy tratando de crear una función que obtiene un mapa de bits y color de destino y devuelve el mapa de bits de color (sin usar pintura). Encontré pocas maneras de hacerlo pero nada funciona como yo lo quiero.
La solución más cercana que pude encontrar es:
- Android Drawable.createFromStream ha asignado demasiada memoria
- Mapa de bits de mosaico de Android
- Android, la forma más rápida de dibujar un mapa de bits a la lona
- Cómo manejar try catch exception android
- Android Map Rendimiento pobre debido a muchas superposiciones?
public static Bitmap changeImageColor(Bitmap srcBmp, int dstColor) { int width = srcBmp.getWidth(); int height = srcBmp.getHeight(); float srcHSV[] = new float[3]; float dstHSV[] = new float[3]; Bitmap dstBitmap = Bitmap.createBitmap(width, height, Config.RGB_565); for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { Color.colorToHSV(srcBmp.getPixel(col, row), srcHSV); Color.colorToHSV(dstColor, dstHSV); // If it area to be painted set only value of original image dstHSV[2] = srcHSV[2]; // value int color2=Color.HSVToColor(dstHSV);; dstBitmap.setPixel(col, row, Color.HSVToColor(dstHSV)); } } return dstBitmap; }
Pero no funciona muy bien en imágenes transparentes como se puede ver aquí (antes y después):
Cualquier persona tiene alguna otra solución (de nuevo sin usar pintura en absoluto)?
- Medidas de altura de StaticLayout fuera
- Android: mapa de bits de una vista de gran tamaño
- Cargar imagen de url en la notificación de Android
- SetColorFilter () y mutable drawables
- Cómo obtener el tamaño del mapa de bits después de mostrarlo en ImageView
- JNI operaciones de mapa de bits, para ayudar a evitar OOM cuando se utilizan imágenes grandes
- OutOfMemoryError mientras decodifica y codifica Base64 String en Bitmap
- Obtener mapa de bits de zoom visible android imagen
Sólo tiene que extraer el alfa y volver a aplicarlo después de la transformación. Y utilice ARGB_8888;
Editado su código para incluir alfa:
public Bitmap colorize(Bitmap srcBmp, int dstColor) { int width = srcBmp.getWidth(); int height = srcBmp.getHeight(); float srcHSV[] = new float[3]; float dstHSV[] = new float[3]; Bitmap dstBitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { int pixel = srcBmp.getPixel(col, row); int alpha = Color.alpha(pixel); Color.colorToHSV(pixel, srcHSV); Color.colorToHSV(dstColor, dstHSV); // If it area to be painted set only value of original image dstHSV[2] = srcHSV[2]; // value dstBitmap.setPixel(col, row, Color.HSVToColor(alpha, dstHSV)); } } return dstBitmap; }
Aquí hay un código de ejemplo para cambiar el color de un mapa de bits:
private BitmapDrawable getColoredBitmap(int color, Context context, int drawableId) { Bitmap source = BitmapFactory.decodeResource(context.getResources(), drawableId); final Bitmap bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); for (int i = 0; i < source.getWidth(); i++) { for (int j = 0; j < source.getHeight(); j++) { int pixel = source.getPixel(i, j); // if (pixel == Color.TRANSPARENT) { // // } else if (pixel == Color.WHITE) { pixel = Color.argb(Color.alpha(pixel), Color.red(Color.WHITE), Color.green(Color.WHITE), Color.blue(Color.WHITE)); } else { pixel = Color.argb(Color.alpha(pixel), Color.red(color), Color.green(color), Color.blue(color)); } bitmap.setPixel(i, j, pixel); } } return new BitmapDrawable(context.getResources(), bitmap); }
Tu hiciste esto:
int alpha=srcBmp.getPixel(col, row); dstBitmap.setPixel(col, row, Color.HSVToColor(dstHSV));
En el que se calcula un alfa (probablemente incorrectamente de las miradas de ese código) y luego no lo utilice. Usted probablemente va a tener que crear un color con HSVToColor, a continuación, establecer el alfa de ese color, a continuación, utilizarlo en setPixel. Y es probable que usted va a tener que obtener el alfa de una manera similar porque me resulta difícil creer que una función getPixel sólo devuelve el alpha: p
- UnsupportedException de Canvas.setBitmap (mapa de bits)
- Samsung Nota 2 no puede llegar onLocationChanged ()