如何基于已有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
相关产品推荐
相关产品推荐

