0

背景 こんにちは、私はコードで自分自身を実装したカメラを持っています。これは、カメラのハードウェアにアクセスして制御し、それを使用して写真を保存することを意味します。カメラの実行中に Camera.takePicture() 関数を使用して画像を保存できます。実行中は Camera.startPreview(); を意味します。

問題私の問題は、カメラ画像がフリーズ しているときにも画像を保存できるようにしたいということです。フリーズすると、レイアウトに画像が表示されますが、どうすればアクセスできますか? 後で変更できるように、画像はどこに保存されますか?

前もって感謝します!

------------------アップデート1

    jpeg bla;
public class jpeg implements PictureCallback{

    public void onPictureTaken(byte[] data, Camera camera) {
        g_data = data;
    }    
}

これは私のコードの一部です。ここでは、もともとグローバル変数に保存されるデータを書き込もうとしています。ただし、g_data の値は null のままで、onPictureTaken() コールバック関数内にブレークポイントを設定できません。

------------------アップデート2

FileOutputStream outStream = null;
    try {
        // generate the folder
        File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MirrorMirror");
        if( !imagesFolder.exists() ) {
            imagesFolder.mkdirs();
        }
        // generate new image name
        SimpleDateFormat formatter = new SimpleDateFormat("HH_mm_ss");
        Date now = new Date();
        String fileName = "image_" + formatter.format(now) + ".jpg";
        // create outstream and write data
        File image = new File(imagesFolder, fileName);
        outStream = new FileOutputStream(image);
        outStream.write(data);
        outStream.close();          
        Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
    } catch (FileNotFoundException e) { // <10>
        //Toast.makeText(ctx, "Exception #2", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {}

以前、このコードを使用して、カメラの onPictureTaken() 関数からファイルを保存しました。ここで重要なのは、保存して後で保存する必要がある byte[] データです。ただし、先ほど言ったように、デバッガーでチェックすると null が返されます。

4

3 に答える 3

1

Camera.takePicture は、previewDisplay として指定したビューを見ません。実際には、これは ImageView ではなく SurfaceView であり、そこからピクセルを読み取る API はありません。

stopPreview() の直前に、先制的に takePicture() を呼び出すことができます。後で、その写真が不要であることがわかった場合は、その写真を破棄してください。

于 2013-07-07T04:04:31.450 に答える
0

これを行う正確な方法は、stopPreview() の直前に写真を撮り、一時ファイルに保存することです。実際、この実装では、takePicture() 関数がプレビューを自動的に停止するため、stopPreview() を呼び出すことはありません (そうしないと、クラッシュします)。

try {
        File temp = File.createTempFile("temp", ".jpg");
    } catch (IOException e) {
        e.printStackTrace();
    }

一時ファイルを保存したので、後でアクセスして、新しい目的のファイルの場所に移動します。 ファイルをコピーする方法。

temp.deleteOnExit();

アプリが閉じられた後にAndroidがファイルを削除するように、必ずdeleteonExit()を呼び出してください(必要な場合)。

于 2013-07-09T04:37:38.617 に答える