【发布时间】:2018-05-25 19:26:21
【问题描述】:
如何将位图着色为纯色,有效地将所有 alpha > 0 的像素替换为给定的 RGB 值?另外如何做同样的事情,但保持每个像素的 alpha?我不是在寻找每像素操作,因为它们往往很慢。
我尝试使用 ColorMatrixColorFilter 和 ColorFilter,它们会为位图着色,但它们会着色而不是执行 100% 着色。
【问题讨论】:
如何将位图着色为纯色,有效地将所有 alpha > 0 的像素替换为给定的 RGB 值?另外如何做同样的事情,但保持每个像素的 alpha?我不是在寻找每像素操作,因为它们往往很慢。
我尝试使用 ColorMatrixColorFilter 和 ColorFilter,它们会为位图着色,但它们会着色而不是执行 100% 着色。
【问题讨论】:
我通过使用 PorterDuffColorFilter 解决了这个问题
Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(targetColor, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(resource, matrix, paint);
【讨论】:
PorterDuff.Mode,有一篇关于波特-达夫规则的精彩文章ibm.com/developerworks/java/library/j-mer0918
只是为了给出更完整的答案。
这将获取一个位图并输出一个新的着色位图:
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;
}
【讨论】:
color 必须是 ARGB 格式,例如 color = 0xFF0000FF 将图像染成纯蓝色。如果您使用color = 0x0000FF,它会将图像设置为完全透明,因为 alpha 部分 = 0x00。
如果您的位图是您想在布局中使用的可绘制对象,那么您可以创建一个引用原始可绘制对象(例如 .png)的新可绘制对象 (.xml)。
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/plus"
android:tint="#2c53e5" />
【讨论】: