Как подкрасить растровое изображение в сплошной цвет

Как можно было бы подкрасить растровое изображение в сплошной цвет, эффективно заменив все пиксели, которые имеют альфа> 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
}
Другие вопросы по тегам