
通过 Bitmap.copy() 创建独立副本,可避免原图被意外修改,实现单次加载、多版本处理(如明暗变换),显著提升性能与内存安全性。
通过 `bitmap.copy()` 创建独立副本,可避免原图被意外修改,实现单次加载、多版本处理(如明暗变换),显著提升性能与内存安全性。
在 Android 开发中,Bitmap 是不可变引用类型——直接赋值或传参并不会创建新图像数据,而是共享同一内存块。正如示例中所示:调用 darkImage(remoteImage) 时,若未显式复制,canvas.drawARGB(...) 等操作会直接修改原始 Bitmap 的像素缓冲区,导致 remoteImage 和 darkImage 同步变暗。
✅ 正确做法是:在修改前调用 copy() 创建深拷贝:
asyncTask(new GetRemoteImage(), (remoteImage) -> {
// 关键:创建独立副本,确保原始图像不受影响
Bitmap remoteImageCopy = remoteImage.copy(
remoteImage.getConfig(),
true // 必须设为 true 才能后续 Canvas 绘制(mutable)
);
Bitmap darkImage = darkImage(remoteImageCopy);
// 此时 remoteImage 保持原始状态,darkImage 为新暗化版本
});⚠️ 注意事项:
-
copy()的第二个参数必须为true(即isMutable = true),否则返回的Bitmap不可绘制(Canvas构造会抛IllegalStateException); -
getConfig()应与原图一致(如Bitmap.Config.ARGB_8888),避免颜色失真或内存异常; - 若原始
Bitmap已回收(recycled),调用copy()会抛出RuntimeException,建议添加空值与状态校验; - 大图复制消耗内存,建议结合
inSampleSize缩放加载,或使用BitmapFactory.Options预估尺寸。
? 进阶提示:对于批量样式处理(如高斯模糊、灰度、色调偏移),可封装通用 BitmapTransformer 工具类,统一管理副本生命周期与线程安全,进一步提升代码复用性与健壮性。

















