如何用BasePostprocessor选择性裁剪Bitmap,避免不必要的新Bitmap创建
仅在需要裁剪时创建新Bitmap的优化方案
你提到的问题确实很关键——每次都无条件创建新Bitmap,哪怕图片尺寸完全符合要求,这无疑会增加不必要的内存开销和CPU消耗。幸运的是,我们可以通过CloseableReference的原生方法来避免这种情况,直接复用原Bitmap的引用。
这里是优化后的process方法:
@Override public CloseableReference<Bitmap> process(Bitmap sourceBitmap, PlatformBitmapFactory bitmapFactory) { final int height = sourceBitmap.getHeight(); final int maxTextureSize = ImageUtils.getMaxTextureSize(); if (height > maxTextureSize) { // 仅当高度超过限制时,才创建裁剪后的新Bitmap return bitmapFactory.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), maxTextureSize, sourceBitmap.getConfig()); } else { // 无需处理时,直接包装原Bitmap的引用,不复制像素数据 return CloseableReference.cloneOrCreate(sourceBitmap); } }
核心思路解析
CloseableReference.cloneOrCreate()这个方法的设计就是为了复用已有引用:如果原Bitmap已经被CloseableReference管理,它会返回一个克隆的引用;如果没有,就创建一个新的引用包装原Bitmap。整个过程不会复制Bitmap的像素数据,完全避免了不必要的内存分配和像素拷贝操作。- 这样既严格遵守了后处理接口的返回要求(必须返回
CloseableReference<Bitmap>),又能在不需要裁剪时做到零额外性能损耗。
额外注意点
- 一定要记得在使用完返回的
CloseableReference后调用close()方法,正确释放引用,防止内存泄漏。 - 确保原Bitmap的生命周期和返回的引用同步,或者保证在引用被关闭前,原Bitmap不会被提前回收。
内容的提问来源于stack exchange,提问作者Lin
相关产品推荐
相关产品推荐

