Cómo cambiar el color de imagen de mapa de bits en android?

Estoy desarrollando una aplicación android en la que establezco una imagen a imageview. Ahora programático quiero cambiar el color de la imagen de mapa de bits. Supongamos que mi imagen tiene color rojo inicialmente y ahora necesito cambiarlo a color naranja. ¿Cómo puedo hacer eso? Por favor ayuda.

Aquí está mi código. Me las arreglé para 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; } 

Intenté la respuesta de Josip, pero no funcionaría para mí, independientemente de si el parámetro de desplazamiento era 1 o 0 – el mapa de bits dibujado sólo apareció en 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

Mientras que el anterior funciona bien y es útil en muchos casos, si sólo desea cambiar el color principal de un ImageView dibujable, que hizo el op, sólo puede utilizar:

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

Si necesita más flexibilidad o esto no 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 para esto últimamente es personalizar la apariencia de un icono de marcador Google v2. Con el fin de utilizar 2 gráficos para permitir (por ejemplo) pequeños / grandes iconos en un marcador, sino también una gama de colores en los gráficos de 2, cambiando el color de ellos dinámicamente. En mi caso estaba haciendo esto dentro de un ClusterRenderer como los marcadores también fueron agrupados, pero esto se puede utilizar 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); } 

La manera más simple 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 de color:

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

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; } 

Un poco fuera de tema, pero teniendo en cuenta que sólo desea mostrar en color cambiado aquí es mi solución. Es decir, la forma más fácil y rápida es simplemente aplicar un filtro utilizando 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

  • Tratando de reducir un mapa de bits en Android no funciona
  • BitmapFactory.decodeFile devuelve una imagen nula incluso existe
  • Cambiar el tamaño de la imagen del archivo
  • Uso óptimo de BitmapFactory.Options.inSampleSize para la velocidad
  • Convertir Bitmap en la memoria a Bitmap con Bitmap.Config.RGB_565
  • Android: inserta una matriz de imágenes de mapa de bits en la base de datos SQLite
  • ¿Hay una solución de reproducción de video más rápida que las funciones de AndroidBitmap_xxx?
  • Mostrar imágenes desde la carpeta Desplegable con Universal Image Loader
  • SetColorFilter () y mutable drawables
  • Cómo cambiar el tamaño de la imagen en Android?
  • ¿Cómo funciona createBitmap (int width, int height, Bitmap.Config config) rellena el Bitmap?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.