Como colorir um bitmap para uma cor sólida
Pergunta
Como alguém faria para tingir um bitmap para uma cor sólida, substituindo efetivamente todos os pixels que têm um alfa> 0 para um determinado valor RGB?Além disso, como fazer a mesma coisa, mas mantendo o alfa para cada pixel?Não estou procurando operações por pixel, pois elas tendem a ser lentas.
Tentei usar um ColorMatrixColorFilter e um ColorFilter, que tingem o bitmap, mas eles colorem em vez de fazer uma coloração 100%.
Solução
Resolvi isso usando um PorterDuffColorFilter
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(targetColor, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(resource, matrix, paint);
Outras dicas
Apenas para dar uma resposta mais completa.
Isso pegará um bitmap e produzirá um novo bitmap colorido:
public static Bitmap tintImage(Bitmap bitmap, int color) {
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
Bitmap bitmapResult = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmapResult);
canvas.drawBitmap(bitmap, 0, 0, paint);
return bitmapResult;
}
Se o seu bitmap for um drawable que você deseja usar em um layout, você pode fazer um novo drawable (.xml) que faz referência ao drawable original (por exemplo, .png).
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/plus"
android:tint="#2c53e5" />