カメラの使用方法(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カードにデータを保存する、というコードを書くと以下のようになります。

// シャッターが押されたときに呼ばれるコールバック
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