カメラの使用方法(2)


今回はカメラの使用方法の後編になります。
前回はカメラをオープンして、SurfaceViewにカメラのプレビュー画面を表示するところまで紹介しました。
今回はプレビュー画面の内容を撮影し、SDカードに保存するという処理まで説明したいと思います。

詳細は続きからどうぞ。

撮影処理を司るのはCameraクラスのtakePictureです。
public final void takePicture (Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)

引数はそれぞれ以下のようになっています。

  • Camera.ShutterCallback shutter:シャッターが押されたときに呼ばれるコールバックを指定します。
  • Camera.PictureCallback raw:Rawイメージ生成後に呼ばれるコールバックを指定します。
  • Camera.PictureCallback jpeg:JPEGイメージ生成後に呼ばれるコールバックを指定します。

ボタンを押したときなどのタイミングでtakePictureメソッドを呼び出してやれば上記の各コールバックが呼ばれることになります。
たとえば、画面を押したときに撮影を行い、SDカードにデータを保存する、というコードを書くと以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// シャッターが押されたときに呼ばれるコールバック
private Camera.ShutterCallback mShutterListener =
    new Camera.ShutterCallback() {
        public void onShutter() {
            // TODO Auto-generated method stub
        }
    };
 
// JPEGイメージ生成後に呼ばれるコールバック
private Camera.PictureCallback mPictureListener =
    new Camera.PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            // SDカードにJPEGデータを保存する
            if (data != null) {
                FileOutputStream myFOS = null;
                try {
                    myFOS = new FileOutputStream("/sdcard/camera_test.jpg");
                    myFOS.write(data);
                    myFOS.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
 
                camera.startPreview();
            }
        }
    };
 
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (myCamera != null) {
            myCamera.takePicture(mShutterListener, null, mPictureListener);
        }
    }
    return true;
}

なお、takePictureメソッドを呼び出すとSurfaceViewへのプレビュー表示がストップしてしまいますので注意が必要です。
上記コードのJPEGイメージ生成後に呼ばれるコールバック処理内の最後でプレビューを再開しているのはそのためです。

4 Comments