记一次系统的bug,yuvImage.compressToJpeg导致内存泄露

在做人脸识别的时候,发现内存一直增加,但是该释放的资源已经释放,经过跟厂家一起排查,是在compressToJpeg转换的时候导致的

复制代码
原代码::YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, size.width, size.height), 100, baos);
byte[] byteArray = baos.toByteArray();

后改成直接转成bitmap。

复制代码
Bitmap yuv2Bitmap = BitmapUtils.yuv2Bitmap(data, size.width, size.height);
复制代码
public static Bitmap yuv2Bitmap(byte[] data, int width, int height) {
    int frameSize = width * height;
    int[] rgba = new int[frameSize];

    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            int y = (0xff & ((int) data[i * width + j]));
            int u = (0xff & ((int) data[frameSize + (i >> 1) * width + (j & ~1) + 0]));
            int v = (0xff & ((int) data[frameSize + (i >> 1) * width + (j & ~1) + 1]));
            y = y < 16 ? 16 : y;

            int r = Math.round(1.164f * (y - 16) + 1.596f * (v - 128));
            int g = Math.round(1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
            int b = Math.round(1.164f * (y - 16) + 2.018f * (u - 128));

            r = r < 0 ? 0 : (r > 255 ? 255 : r);
            g = g < 0 ? 0 : (g > 255 ? 255 : g);
            b = b < 0 ? 0 : (b > 255 ? 255 : b);

            rgba[i * width + j] = 0xff000000 + (b << 16) + (g << 8) + r;
        }
    }

    Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    bmp.setPixels(rgba, 0, width, 0, 0, width, height);
    return bmp;
}  

观察了几天,并不会出现

相关推荐
xqlily24 分钟前
Kotlin:现代编程语言的革新者
android·开发语言·kotlin
HelloBan26 分钟前
如何正确去掉SeekBar的Thumb和按压效果
android
木易 士心27 分钟前
Android EventBus 源码解析:设计模式、原理与实现
android
ClassOps1 小时前
源码阅读 LeakCanary
android
用户2018792831671 小时前
为啥现在 Android App 不用手动搞 MultiDex 了?
android
fouryears_234171 小时前
如何将Vue 项目转换为 Android App(使用Capacitor)
android·前端·vue.js
消失的旧时光-19431 小时前
人脸跟随 ( Channel 实现(缓存5条数据 + 2度过滤 + 平滑移动))
android·java·开发语言·kotlin
小王lj2 小时前
画三角形报错bad_Alloc 原因,回调用错
android
xhbh6662 小时前
【实战避坑】MySQL自增主键(AUTO_INCREMENT)全解:从锁机制、间隙问题到分库分表替代方案
android·数据库·mysql·mysql自增主键
TimeFine2 小时前
Android 通过Dialog实现全屏
android