web-dev-qa-db-ja.com

Androidプログラミングでカメラアプリケーションからプレビュー画像フレームをキャプチャする方法は?

カメラのプレビューフレームをキャプチャして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); 

プレビューを開始した後、コールバックがデータで呼び出されましたが、ビットマップがnullです。

バイト配列をビットマップに変換するときに何を間違えましたか?

9
Hongwei Yan

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

写真を撮る別の方法については、この記事をチェックしてください: Androidでカメラを使用する方法

19
user1553112

BitmapFactoryを使用する前に、プレビューフレームデータをRGBにデコードしてみましたか?デフォルトのフォーマットはYUVですが、BitmapFactoryと互換性があるかどうかはわかりません。 Dave Manpearlのデコード方法はここにあります:

Androidのビデオ画像からフレームを取得する

動作するかどうか教えてください。

乾杯、

ポール

1
paul_wong_