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:

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): Introduzca aquí la descripción de la imagen

Cualquier persona tiene alguna otra solución (de nuevo sin usar pintura en absoluto)?

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

  • Android: Bitmap a Byte Array y espalda: SkImageDecoder :: Factory devuelto null
  • Utilice MediaCodec y MediaExtractor para decodificar y codificar vídeo
  • Superposición de color en android NDK
  • ¿Por qué setImageBitmap no tiene efecto en ImageButton personalizado?
  • El tamaño del mapa de bits supera el error de presupuesto de Vm android
  • Bitmap decodeStream OutOfMemory Excepción
  • ¿Por qué Android dibuja Vista dentro de otra (con anchura y altura definidas en píxeles) de manera incorrecta?
  • Cambiar la profundidad de bits de Bitmap
  • Cómo escribir el texto perfecto de píxeles en el mapa de bits utilizando la pintura para diferentes tamaños de pantalla
  • Rendimiento de mapa de bits escala android
  • Ronda de las esquinas inferior en Android Bitmap?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.