如何将位图着色为纯色

Wil*_*Kru 18 android tint colors

如何将Bitmap着色为纯色,有效地将alpha> 0的所有像素替换为给定的RGB值?另外如何做同样的事情,但保持每个像素的alpha?我不是在寻找每像素操作,因为它们往往很慢.

我尝试使用ColorMatrixColorFilter和ColorFilter,它们对Bitmap进行着色,但它们着色而不是执行100%色调.

Wil*_*Kru 37

我通过使用PorterDuffColorFilter解决了这个问题

Paint paint = new Paint();
paint.setColorFilter(new PorterDuffColorFilter(targetColor, PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(resource, matrix, paint);
Run Code Online (Sandbox Code Playgroud)

  • 如果你想知道你应该选择哪个`PorterDuff.Mode`,那么有一篇关于Porter-Duff规则的文章很棒http://www.ibm.com/developerworks/java/library/j-mer0918/ (5认同)

joa*_*gcd 23

只是为了给出更完整的答案.

这将采用位图并输出新的着色位图:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • `color` 必须是 ARGB 格式,比如 `color = 0xFF0000FF` 将图像染成纯蓝色。如果你使用 `color = 0x0000FF` 它会将图像设置为完全透明,因为 alpha 部分 = 0x00。 (2认同)