【问题标题】:data byte array size different for onPictureTaken and onPreviewFrameonPictureTaken 和 onPreviewFrame 的数据字节数组大小不同
【发布时间】:2025-12-02 03:10:01
【问题描述】:

为什么 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);
}

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

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

【问题讨论】:

    标签: android android-camera android-bitmap


    【解决方案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() 的用途。