Как подкрасить растровое изображение в сплошной цвет
Как можно было бы подкрасить растровое изображение в сплошной цвет, эффективно заменив все пиксели, которые имеют альфа> 0, на заданное значение RGB? Кроме того, как сделать то же самое, но сохранить альфа для каждого пикселя? Я не ищу за пиксельные операции, поскольку они имеют тенденцию быть медленными.
Я попытался использовать ColorMatrixColorFilter и ColorFilter, которые окрашивают растровое изображение, но они окрашивают вместо выполнения 100% оттенка.
4 ответа
Я решил это с помощью PorterDuffColorFilter
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(targetColor, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(resource, matrix, paint);
Просто чтобы дать более полный ответ.
Это возьмет растровое изображение и выведет новое тонированное растровое изображение:
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;
}
Если ваше растровое изображение - это чертеж, который вы хотите использовать в макете, то вы можете создать новый чертеж (.xml), который ссылается на ваш оригинальный чертеж (например,.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" />
Решение Kotlin, потому что по какой-то причине преобразование других решений привело к сокращению результата растрового изображения:
fun getTintedBitmap(inputBitmap: Bitmap, @ColorInt color: Int): Bitmap {
val paint = Paint()
paint.colorFilter = PorterDuffColorFilter(color, Mode.SRC_IN)
val width = inputBitmap.width
val height = inputBitmap.height
val result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(result)
canvas.drawBitmap(inputBitmap, null, Rect(0, 0, width, height), paint)
return result
}