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

Hon*_*Yan 9 camera android bitmap

我正在编写一个应用程序来捕获相机预览帧并将其转换为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); 
Run Code Online (Sandbox Code Playgroud)

在我开始预览之后,使用数据调用回调,但位图为空.

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

小智 19

在该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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种拍照方式,看看这篇文章:如何在android中使用相机


小智 1

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

在Android中从视频图像获取帧

让我知道它是否有效。

干杯,

保罗