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

如何在不重复获取远程图片的情况下生成两个不同的Bitmap?

解决方案:复制Bitmap副本后再处理

你猜的没错,问题根源就是两个变量指向同一个Bitmap实例,修改其中一个会直接影响另一个。不用重复请求图片,只需要先创建原Bitmap的独立副本,再对副本做变暗处理即可。

修改后的代码实现

asyncTask(new GetRemoteImage(), (remoteImage) -> {
    // 对原Bitmap创建一份可修改的副本并处理
    Bitmap darkImage = darkImage(remoteImage);
    // 此时remoteImage保持原图状态,darkImage是变暗后的独立实例
});


private static Bitmap darkImage(Bitmap originalBm) {
    if (originalBm == null) {
        return null;
    }
    
    // 创建原Bitmap的可修改副本,匹配原Bitmap的配置和尺寸
    Bitmap copyBm = originalBm.copy(originalBm.getConfig(), true);
    if (copyBm == null) {
        // 若copy失败(比如原Bitmap不可修改),手动创建相同尺寸的Bitmap并绘制原图
        copyBm = Bitmap.createBitmap(originalBm.getWidth(), originalBm.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas tempCanvas = new Canvas(copyBm);
        tempCanvas.drawBitmap(originalBm, 0, 0, null);
    }
    
    // 在副本上执行变暗操作
    Canvas canvas = new Canvas(copyBm);
    canvas.drawARGB(175, 0, 0, 0);
    canvas.drawBitmap(copyBm, new Matrix(), new Paint());
    
    return copyBm;
}

关键说明

  • Bitmap.copy()方法:直接创建原Bitmap的副本,第二个参数传true表示副本是可修改的(mutable),确保后续能在Canvas上绘制修改。
  • 异常兼容:如果原Bitmap是不可修改状态(比如部分远程加载或资源加载的Bitmap),copy()可能返回null,这时候用Bitmap.createBitmap()手动创建相同尺寸的Bitmap,再把原图绘制进去。
  • 内存管理:Bitmap占用内存较大,使用完darkImage后记得调用darkImage.recycle()(不需要显示时),避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:02:05