如何从Android编程中的Camera Application捕获预览图像帧?

时间:2010-07-31 03:33:54

标签: android bitmap camera

我正在编写一个应用程序来捕获相机预览帧并将其转换为Android中的位图。这是我的代码:

   Camera.PreviewCallback previewCallback = new Camera.PreviewCallback()  
    { 
            public void onPreviewFrame(byte[] data, Camera camera)  
            { 
                    try 
                    { 
                            BitmapFactory.Options opts = new BitmapFactory.Options(); 
                            Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//,opts); 
                    } 
                    catch(Exception e) 
                    {

                    } 
            } 

    }; 

    mCamera = Camera.open();
    mCamera.setPreviewCallback(previewCallback); 

开始预览后,使用数据调用回调,但位图为空。

将字节数组转换为BitMap时,我做错了什么?

2 个答案:

答案 0 :(得分:18)

onPreviewFrame()功能中,您应首先检查图像格式。
这是NV21的例子。

public void onPreviewFrame(byte[] data, Camera camera) 
{
    Parameters parameters = camera.getParameters();
    imageFormat = parameters.getPreviewFormat();
    if (imageFormat == ImageFormat.NV21)
    {
        Rect rect = new Rect(0, 0, PreviewSizeWidth, PreviewSizeHeight); 
        YuvImage img = new YuvImage(data, ImageFormat.NV21, PreviewSizeWidth, PreviewSizeHeight, null);
        OutputStream outStream = null;
        File file = new File(NowPictureFileName);
        try 
        {
            outStream = new FileOutputStream(file);
            img.compressToJpeg(rect, 100, outStream);
            outStream.flush();
            outStream.close();
        } 
        catch (FileNotFoundException e) 
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

另一种拍照方式,请查看此文章:how to use camera in android

答案 1 :(得分:1)

在使用BitmapFactory之前,您是否尝试将预览帧数据解码为RGB?默认格式是YUV,我不确定它与BitmapFactory兼容。 Dave Manpearl的解码方法可以在这里找到:

Getting frames from Video Image in Android

让我知道它是否有效。

干杯,