onPictureTaken 和 onPreviewFrame 的数据字节数组大小不同

Posted

技术标签:

【中文标题】onPictureTaken 和 onPreviewFrame 的数据字节数组大小不同【英文标题】:data byte array size different for onPictureTaken and onPreviewFrame 【发布时间】:2015-12-20 01:10:16 【问题描述】:

为什么 onPictureTaken(byte[] data, Camera camera) 和 onPreviewFrame(byte[] data, Camera camera) 的数据字节数组大小不同。前者有原始图像,因此给了我一个干净的图像,后者给了我一个像素化的图像。我没有使用 onPictureTaken,因为它有时不会被触发。 如果我的图片尺寸是 1600 x 1400,屏幕尺寸是 800 x 480 onPictureTaken 给我 1600 x 1400 和 onPreviewFrame 给我 800 x 480

这是我的代码:

mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() 
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) 
                Camera.Parameters parameters = camera.getParameters();
                int format = parameters.getPreviewFormat();
                //YUV formats require more conversion
                if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) 
                    int w = parameters.getPreviewSize().width;
                    int h = parameters.getPreviewSize().height;
                    // Get the YuV image
                    YuvImage yuv_image = new YuvImage(data, format, w, h, null);

我被这个问题困扰了一个星期。

附: - 如果是负面评价,请说明原因

【问题讨论】:

【参考方案1】:

为什么 onPictureTaken(byte[] data, Camera camera) 和 onPreviewFrame(byte[] data, Camera camera) 的数据字节数组大小不同。

因为它们是不同编码的不同分辨率的不同图像。如果它们 大小相同,那将是一个小奇迹。

前者有原始图像,因此给我一个干净的图像,后者给我一个像素化图像

预览帧的质量通常较低,因为它们需要以高速捕获。

我没有使用 onPictureTaken,因为它有时不会被触发

虽然我在相机 API 方面遇到了很多问题,但这不是其中之一。

onPreviewFrame 给我 800 x 480

您在setPreviewSize() on Camera.Parameters 中指定预览分辨率。

【讨论】:

有没有办法将编码的 onPreviewFrame 数组转换为 onPictureTaken ?并且支持的最大预览大小为 800 x 480。在姜饼中,有时很少会触发 onPictureTaken。 @Rohit_Ramkumar:“有没有办法将编码的 onPreviewFrame 数组转换为 onPictureTaken ?” -- onPictureTaken() 是一种方法。无法获取预览图像并将其转换为 Java 方法。 “并且支持的最大预览尺寸为 800 x 480”——可能在您的设备上,但预览尺寸因设备而异。 唯一的解决方案是 onPictureTaken() ?我正在尝试为文件拍照并上传。因此文件必须是可读的。 @Rohit_Ramkumar:“唯一的解决方案是 onPictureTaken() ?” -- 如果您关心的是低质量的预览图像,那么是的,这就是onPictureTaken() 的用途。

以上是关于onPictureTaken 和 onPreviewFrame 的数据字节数组大小不同的主要内容,如果未能解决你的问题,请参考以下文章

Android camera , onPictureTaken(byte[] imgData, Camera camera) 方法和 PictureCallback 从未调用

从 onPictureTaken 结果裁剪圆形图像

onPictureTaken 方法中的位图不是垃圾收集的

在 onPictureTaken 之后旋转 JPEG 的字节数组

PictureCallback 在“onPictureTaken”中获取字节 [] 数据,但它与我在 CameraView 中看到的图像不匹配。

onPictureTaken byte[] 某些设备中的小尺寸