找茬小王子 2023-10-12 11:05 采纳率: 50%
浏览 7
已结题

camera拍照数据NV21格式处理问题

NV21的byte数据用这个方法转成bitmap后显示正常:

Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

但是用YuvImage的方法转换后就有问题不知道什么原因
效果图和代码如下:

img

YuvImage yuvImage = new YuvImage(data, ImageFormat.NV21, width, height, null);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, outputStream);
byte[] jpeg = outputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length);

然后我又用了另外一种方法转成NV12格式后再转成bitmap后显示的图像只有一半,另一半是灰色,不知道到底是咋了

img

 byte[] data12 = NV21ToNV12(data,1920, 1080);
bitmap = BitmapFactory.decodeByteArray(data12, 0, data12.length);

 private byte[] NV21ToNV12(byte[] nv21, int width, int height) {
        if (nv21 == null) {
            return null;
        }
        ;
        int size = nv21.length;
        byte[] nv12 = new byte[size];
        int framesize = size * 2 / 3;
        int i = 0, j = 0;
        System.arraycopy(nv21, 0, nv12, 0, framesize);
        for (i = 0; i < framesize; i++) {
            nv12[i] = nv21[i];
        }
        for (j = 0; j < framesize / 2; j += 2) {
            nv12[framesize + j - 1] = nv21[j + framesize];
        }
        for (j = 0; j < framesize / 2; j += 2) {
            nv12[framesize + j] = nv21[j + framesize - 1];
        }
        return nv12;
    }

请教各位大V,以上代码有什么问题,出现这些问题的原因是什么,该如何解决

  • 写回答

2条回答 默认 最新

  • 不会写代码的猴子 Android领域优质创作者 2023-10-13 10:07
    关注

    你用的是camerax还是camera2呢?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月5日
  • 已采纳回答 12月5日
  • 创建了问题 10月12日

悬赏问题

  • ¥15 matlab运行到net = trainNetwork(p_train, t_train, layers, options)就闪退
  • ¥50 vue3 + vite + electron打包找不到第三方包?
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题