如何将位图着色为纯色,有效地将alpha〉0的所有像素替换为给定的RGB值?此外,如何做同样的事情,但保持每个像素的alpha?我不想寻找逐像素操作,因为它们往往很慢。我尝试使用ColorMatrixColorFilter和ColorFilter,这两个工具可以给位图着色,但是它们是着色的,而不是执行100%着色。
mrphzbgm1#
我通过使用PorterDuffColorFilter解决了这个问题
Paint paint = new Paint(); paint.setColorFilter(new PorterDuffColorFilter(targetColor, PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(resource, matrix, paint);
ryevplcw2#
只是为了给予一个更完整的答案。这将获取一个位图并输出一个新的着色位图:
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; }
k4ymrczo3#
如果你的位图是一个你想在布局中使用的可绘制对象,那么你可以创建一个新的可绘制对象(.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" />
mfuanj7w4#
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 }
4条答案
按热度按时间mrphzbgm1#
我通过使用PorterDuffColorFilter解决了这个问题
ryevplcw2#
只是为了给予一个更完整的答案。
这将获取一个位图并输出一个新的着色位图:
k4ymrczo3#
如果你的位图是一个你想在布局中使用的可绘制对象,那么你可以创建一个新的可绘制对象(.xml)来引用你原来的可绘制对象(例如png)。
mfuanj7w4#
Kotlin解决方案,因为由于某种原因转换其他解决方案导致位图结果被剪切: