android - onPreviewFrame 返回错误的 byte[] 长度

标签 android

我正在尝试获取字节数组并从那里复制到另一个数组,使用 onPreviewFrame() 预览一些图片行。所以我准备了相机和新的字节数组

        try {
        if (cam != null) {

            Camera.Parameters parameters = cam.getParameters();
            parameters.setPreviewFrameRate(25);
            parameters.setPictureFormat(ImageFormat.JPEG);
            cam.setParameters(parameters);
            cam.setPreviewDisplay(holder);
            cam.startPreview();

            arr = new byte[(parameters.getPreviewSize().height)
                    * (parameters.getPreviewSize().width)];

            Log.i("" + parameters.getPictureSize().height, "   "
                    + parameters.getPictureSize().width);


        }
    } catch (IOException e) {
        Log.d("CAMERA", e.getMessage());
    }

日志告诉我:

480 640

所以 arr.length = 307200

但是:

public void onPreviewFrame(byte[] data, Camera camera) {    
    Log.i(arr.length+" ",data.length+"");
}

arr.length = 307200 (这当然意味着 Frame Size = 640*480)

但是 data.length = 460800 (这意味着帧大小 = 800*576)

当我尝试使用 System.arraycopy(data, 0, arr, 0, arr.length); 将数据复制到 Arr,然后导出图片时:

FileOutputStream outStream = null;
    try {
        outStream = new FileOutputStream("/sdcard/new.jpg");

        Camera.Parameters parameters = cam.getParameters();
        Size size = parameters.getPreviewSize();

        YuvImage image = new YuvImage(arr, parameters.getPreviewFormat(),
                size.width, size.height, null);
        image.compressToJpeg(
                new Rect(0, 0, image.getWidth(), image.getHeight()), 90,
                outStream);

        outStream.flush();
        outStream.close();
    } catch (FileNotFoundException e) {
        Log.d("CAMERA", e.getMessage());
    } catch (IOException e) {
        Log.d("CAMERA", e.getMessage());
    }

图片变绿:

enter image description here

那么我需要做什么才能使数据数组变成 640*480?或者,也许您知道另一种从(例如)Bitmap 获取单行并将其添加到另一个 Bitmap 的方法?

最佳答案

正确的数组大小是 new byte[previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(parameters.getPreviewFormat()))/8];(不同的格式有不同的bits-per-pixel值,用ImageFormat.getBitsPerPixel获取)

关于android - onPreviewFrame 返回错误的 byte[] 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12991906/

相关文章:

android - 如何使 ListView (已创建)可点击(Android)?

android - 有没有办法在模拟器中将 ro.kernel.qemu 设置为 0?

android - 在 bash 脚本中运行 apktool

java - 构建中的 Android Studio 错误 - 原因 : startElement. getAttributeByName(QName ("name")) 不能为空

java - 在 tilemap 上使用 Libgdx 渲染 Sprite

android - 在回收者 View 中加载大量项目

java - 在 Android 上使用 Google Recaptcha

android - 在 TextView 中绘制底线,与 Android 中 EditText 中出现的底线完全相同

java - 在不同用户上创建地理围栏

android - 在不关闭硬件加速的情况下实现drawCircle(或drawRoundRect)期间的setShadowLayer效果