从Android中的相机预览中获取较小的数据

时间:2011-12-04 00:59:14

标签: android android-camera

您正在开发Android上的实时图像处理应用程序。我正在使用PreviewCallback在每一帧中获取图像。当我在Tablet设备中获取数据时,数据返回非常大。因此,实时处理大数据太难了。 我的问题是,有没有办法从相机预览中获得较小的分辨率数据。

相机预览代码:

public void onPreviewFrame(byte[] data, Camera camera) {
                        // TODO Auto-generated method stub
                        Camera.Parameters params = camera.getParameters();

                        Log.v("image format", Integer.toString(params.getPreviewFormat()));
                        //Frame captureing via frameManager
                        frameManager.initCamFrame(params.getPreviewSize().width, params.getPreviewSize().height,
                                data);
                    }
                });

3 个答案:

答案 0 :(得分:0)

您是否知道可以通过拨打getSupportedPreviewSizes()从相机参数中获取支持的预览尺寸列表?我尝试过的所有设备都返回了一个排序列表,尽管有时会按升序排列,有时会按降序排列。您可能希望手动迭代列表以找到“最小”预览大小,或者先将其排序并抓取第一个项目。

答案 1 :(得分:0)

您可以调用参数。setPreviewSize(宽度,高度),但您希望在相机预览开始之前执行此操作。而且您需要使用支持的值,即之前的答案。

你也不应该每帧调用camera.getParameters(),只需执行一次并将值保存到某个变量。你在onPreviewFrame上的时间有限,因为每个帧都会覆盖byte []数据,所以尽量只做重要的事情。

您应该使用setPreviewCallbackWithBuffer,这会大大提高效果 - 请检查this post

答案 2 :(得分:0)

你可以试试这个:

 @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
        try {
            byte[] baos = convertYuvToJpeg(data, camera);
            StringBuilder dataBuilder = new StringBuilder();
            dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT));
            mSocket.emit("newFrame", dataBuilder.toString());
        } catch (Exception e) {
           Log.d("########", "ERROR");
        }
    }

};


public byte[] convertYuvToJpeg(byte[] data, Camera camera) {

    YuvImage image = new YuvImage(data, ImageFormat.NV21,
            camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int quality = 20; //set quality
    image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality


    return baos.toByteArray();
}