onPreviewFrame返回错误的byte []长度

时间:2012-10-20 19:30:25

标签: android

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

        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());
    }

Log告诉我:

480 640

所以arr.length = 307200

可是:

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

arr.length = 307200 (当然这意味着帧大小= 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的方法吗?

1 个答案:

答案 0 :(得分:5)

正确的数组大小是 new byte[previewSize.height * previewSize.width * (ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())) / 8];(不同的格式具有不同的每像素位值,使用ImageFormat.getBitsPerPixel获取它们)