¿Cómo cambiar el color de la imagen de bitmap en Android?

Estoy desarrollando una aplicación de Android en la que configuro una imagen para la vista de imagen. Ahora programático, quiero cambiar el color de la imagen de bitmap. Supongamos que mi imagen tiene color rojo inicialmente y ahora necesito cambiarla a color naranja. ¿Cómo puedo hacer eso? Por favor ayuda.

Aquí está mi código. Logré cambiar la opacidad, pero no sé cómo cambiar el color.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView iv = (ImageView) findViewById(R.id.img); Drawable d = getResources().getDrawable(R.drawable.pic1); Bitmap mNewBitmap = ((BitmapDrawable)d).getBitmap(); Bitmap nNewBitmap = adjustOpacity(mNewBitmap); iv.setImageBitmap(nNewBitmap); } private Bitmap adjustOpacity( Bitmap bitmap ) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); int[] pixels = new int[width * height]; bitmap.getPixels(pixels, 0, width, 0, 0, width, height); dest.setPixels(pixels, 0, width, 0, 0, width, height); return dest; } 

Probé la respuesta de Josip pero no funcionó para mí, independientemente de si el parámetro de compensación era 1 o 0: el bitmap dibujado simplemente apareció en el color original.

Sin embargo, esto funcionó:

 // You have to copy the bitmap as any bitmaps loaded as drawables are immutable Bitmap bm = ImageLoader.getInstance().loadImageSync("drawable://" + drawableId, o) .copy(Bitmap.Config.ARGB_8888, true); Paint paint = new Paint(); ColorFilter filter = new PorterDuffColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK), PorterDuff.Mode.SRC_IN); paint.setColorFilter(filter); Canvas canvas = new Canvas(bm); canvas.drawBitmap(bm, 0, 0, paint); 

Actualización 1

Si bien lo anterior funciona bien y es útil en muchos casos, si solo desea cambiar el color principal de un elemento dibujable de ImageView , lo que hizo el operador, simplemente puede usar:

 imgView.setColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK)); 

Si necesita más flexibilidad o esto no le da el efecto deseado, hay una sobrecarga que le permite cambiar el modo PorterDuff hasta que obtenga lo que busca :

 imgView.setColorFilter(ContextCompat.getColor(this, R.color.COLOR_1_DARK), PorterDuff.Mode.SRC_ATOP); 

Actualización 2

Otro buen caso de uso que he tenido últimamente es la personalización de la apariencia de un icono de marcador de Google v2. Para usar 2 gráficos para permitir (por ejemplo) icons pequeños / grandes en un marcador, pero también una gama de colores en esos 2 gráficos cambiando dinámicamente el color de los mismos. En mi caso, estaba haciendo esto dentro de un ClusterRenderer ya que los marcadores también estaban agrupados, pero esto se puede usar con un marcador de mapa regular de la misma manera:

 @Override protected void onBeforeClusterItemRendered(MyClusterItem item, MarkerOptions markerOptions) { try { int markerColor = item.getColor(); Bitmap icon; if (item.isFeatured()) { // We must copy the bitmap or we get an exception "Immutable bitmap passed to Canvas constructor" icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_marker_large).copy(Bitmap.Config.ARGB_8888, true); } else { // We must copy the bitmap or we get an exception "Immutable bitmap passed to Canvas constructor" icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_marker_small).copy(Bitmap.Config.ARGB_8888, true); } Paint paint = new Paint(); ColorFilter filter = new PorterDuffColorFilter(ContextCompat.getColor(context, markerColor), PorterDuff.Mode.SRC_IN); paint.setColorFilter(filter); Canvas canvas = new Canvas(icon); canvas.drawBitmap(icon, 0, 0, paint); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(icon)); } catch (Exception ex) { ex.printStackTrace(); } } 

Tengo una especie de solución.

  Bitmap sourceBitmap = BitmapFactory.decodeFile(imgPath); float[] colorTransform = { 0, 1f, 0, 0, 0, 0, 0, 0f, 0, 0, 0, 0, 0, 0f, 0, 0, 0, 0, 1f, 0}; ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0f); //Remove Colour colorMatrix.set(colorTransform); //Apply the Red ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); Paint paint = new Paint(); paint.setColorFilter(colorFilter); Display display = getWindowManager().getDefaultDisplay(); Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, (int)(display.getHeight() * 0.15), display.getWidth(), (int)(display.getHeight() * 0.75)); image.setImageBitmap(resultBitmap); Canvas canvas = new Canvas(resultBitmap); canvas.drawBitmap(resultBitmap, 0, 0, paint); 
 private void changeColor(){ ImageView image = (ImageView) findViewById(R.id.imageView1); Bitmap sourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); changeBitmapColor(sourceBitmap, image, Color.BLUE); } private void changeBitmapColor(Bitmap sourceBitmap, ImageView image, int color) { Bitmap resultBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth() - 1, sourceBitmap.getHeight() - 1); Paint p = new Paint(); ColorFilter filter = new LightingColorFilter(color, 1); p.setColorFilter(filter); image.setImageBitmap(resultBitmap); Canvas canvas = new Canvas(resultBitmap); canvas.drawBitmap(resultBitmap, 0, 0, p); } 

Es mejor obtener bitmap mutable por copia, sin cambiar el tamaño:

 public static Bitmap changeBitmapColor(Bitmap sourceBitmap, int color) { Bitmap resultBitmap = sourceBitmap.copy(sourceBitmap.getConfig(),true); Paint paint = new Paint(); ColorFilter filter = new LightingColorFilter(color, 1); paint.setColorFilter(filter); Canvas canvas = new Canvas(resultBitmap); canvas.drawBitmap(resultBitmap, 0, 0, paint); return resultBitmap; } 

La forma más sencilla de cambiar el color de los mapas de bits es con este método:

 bitmap.eraseColor(ContextCompat.getColor(this, R.color.your_color)); 

Si desea superponer el ImageView con el uso del color:

 imageView.setColorFilter(ContextCompat.getColor(this, R.color.your_color)); 

Un poco fuera de tema, pero teniendo en cuenta que solo quieres mostrar en color modificado aquí está mi solución. A saber, la manera más fácil y rápida es simplemente aplicar un filtro mediante el método drawColor () en Canvas, justo después de drawBitmap () :

  m_canvas.drawColor(Color.RED, PorterDuff.Mode.ADD); 

Fuentes: https://developer.android.com/reference/android/graphics/PorterDuff.Mode.html

He resuelto el problema usando esto,

public void changeColor (Bitmap srcImage) {

  Bitmap bmpRedscale = Bitmap.createBitmap(srcImage.getWidth(), srcImage.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmpRedscale); Paint paint = new Paint(); ColorMatrix cm = new ColorMatrix(); cm.setRGB2YUV(); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap(srcImage, 0, 0, paint); mImgEdited.setImageBitmap(bmpRedscale); }