You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于已有Bitmap、指定颜色及透明度生成变色后的新Bitmap?

动态给Bitmap叠加带透明度的纯色蒙层

我之前做教学类游戏开发时,刚好碰到过和你一模一样的需求——不想存一堆不同色调的图片占体积,又要给复用的Bitmap加各种半透明色调。其实实现起来很简单,核心思路就是用Canvas在原Bitmap上叠加一个带透明度的纯色矩形,完美模拟PS里的图层叠加效果。

核心实现方法

下面是封装好的工具方法,你直接调用就行。传入原Bitmap、目标颜色和透明度(0-255,0完全透明,255完全不透明),就能返回处理后的新Bitmap:

public static Bitmap addColorOverlay(Bitmap originalBitmap, int color, int alpha) {
    // 创建和原Bitmap尺寸、格式一致的可变Bitmap,用于绘制蒙层
    Bitmap overlayBitmap = Bitmap.createBitmap(
        originalBitmap.getWidth(),
        originalBitmap.getHeight(),
        originalBitmap.getConfig()
    );
    
    // 关联Canvas到新Bitmap
    Canvas canvas = new Canvas(overlayBitmap);
    // 先绘制原始Bitmap
    canvas.drawBitmap(originalBitmap, 0, 0, null);
    
    // 配置带透明度的画笔
    Paint paint = new Paint();
    // 合并颜色与透明度(也可以直接用Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color)))
    paint.setColor(color);
    paint.setAlpha(alpha);
    // 设置混合模式,SRC_ATOP能保证蒙层只覆盖原Bitmap的非透明区域,和PS效果一致
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
    
    // 绘制覆盖整个Bitmap的纯色矩形
    canvas.drawRect(0, 0, originalBitmap.getWidth(), originalBitmap.getHeight(), paint);
    
    return overlayBitmap;
}

关键细节说明

  • 混合模式选择:PorterDuff.Mode.SRC_ATOP是核心,它会让纯色蒙层只附着在原Bitmap的非透明像素上,不会影响图片的透明空白区域,完全还原PS的图层叠加逻辑。
  • 透明度控制:alpha参数范围是0-255,比如要50%透明度就传127,你可以根据业务需求灵活调整数值。
  • 内存优化:因为你会频繁复用这个功能,记得在不需要处理后的Bitmap时,调用bitmap.recycle()释放内存;如果游戏里这类操作很多,建议配合Bitmap缓存池来复用对象,避免内存溢出。

调用示例

比如给原Bitmap加一个半透明黄色蒙层:

// 假设你已经获取到原始bitmap
Bitmap originalBitmap = ...;
// 黄色(0xFFFF00)+ 50%透明度(127)
Bitmap tintedBitmap = addColorOverlay(originalBitmap, 0xFFFF00, 127);
// 绘制到屏幕
canvas.drawBitmap(tintedBitmap, x, y, null);
// 用完回收临时Bitmap(原Bitmap如果还要复用,只回收tintedBitmap)
tintedBitmap.recycle();

这样就不用提前存一堆重复图片了,完全动态生成,既省安装包体积又灵活。

内容的提问来源于stack exchange,提问作者gibsonff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:33:10