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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:28:47