【问题标题】:How to draw a bitmap on a canvas, respecting alpha values of the bitmap?如何在画布上绘制位图,尊重位图的 alpha 值?
【发布时间】:2025-12-09 23:20:08
【问题描述】:

背景

我有一个主位图,我需要在其上绘制其他位图。

主位图有一些半透明像素(alpha 通道具有不同值的像素),因此在其上绘制的其他位图应与其合并,而不是完全覆盖颜色。

问题

如何设置画布以在主位图上相对于半透明像素绘制位图?

注意:alpha 不适用于整个 bitmap/s 。它是每像素。

【问题讨论】:

  • 你有两个不同的位图?
  • 是的,甚至更多。现在我想起来了,也许用油漆对象设置一些东西就可以了。
  • 查看我的回答:*.com/a/44754944/2603965

标签: android bitmap android-canvas alpha-transparency


【解决方案1】:

Canvas.setXfermode(Xfermode xfermode)。您可以选择多个Xfermodes。

【讨论】:

  • 正确的似乎是 DST_ATOP :paint.setXfermode(new PorterDuffXfermode(Mode.DST_ATOP));
  • @android 开发者。我不得不说你需要测试哪个适合你;)
  • 是的,我想要的是,如果有 alpha,它将根据 alpha 的值与另一个位图合并,就像当您使用绘画应用程序并将区域裁剪为半透明区域。
  • +100 的解决方案,在互联网上搜索 3 小时,但这是唯一有效的解决方案 :)
【解决方案2】:
public void putOver(Bitmap master, Bitmap alphaBitmap){
    Canvas canvas = new Canvas(matter);
    Paint paint = new Paint();
    paint.setXferMode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
    canvas.drawBitmap(left, top, left+alphaBitmap.width, left+alphaBitmap.height, paint);
}

【讨论】:

  • 欢迎来到 Stack Overflow!一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决了问题,那么答案会更有帮助。
【解决方案3】:
    public Bitmap PutoverChange(Bitmap all, Bitmap scaledBorder) {
    Paint paint = new Paint();
    final int width = change.getWidth();
    final int height = change.getHeight();
    patt = Bitmap.createScaledBitmap(change, width, height, true);
    Bitmap mutableBitmap = patt.copy(Bitmap.Config.ARGB_8888, true);
    Canvas canvas = new Canvas(mutableBitmap);
    scaledBorder = Bitmap.createScaledBitmap(border, width, height, true);
    paint.setAlpha(100);
    canvas.drawBitmap(scaledBorder, 0, 0, paint);
    return mutableBitmap;

}

这里的透明度为 100。您可以将其修改为 50,使其变为半透明。

【讨论】:

  • 我已经写过我不想设置整个位图的透明度。有些像素具有透明度,而不是全部,有些像素具有不同的透明度值。