如何在不重复获取远程图片的情况下生成两个不同的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
相关产品推荐
相关产品推荐

