【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 写真の向き
android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。
Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はCamera.Parametersの写真の向きに関連する設定値を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。
写真の向き
カメラデバイスにキャプチャした写真データの向き情報を設定することができます。写真の向きは0,90,180,270が設定ができます。この数値はカメラデバイスの取り付け向きからの時計回りの回転角度になります。
Camera.Parameters内にあるサムネイルのJPEG品質に関連するデータのキーは下記のとおりです。
jpeg-thumbnail-quality | カメラデバイスに現在設定されているサムネイルのJPEG品質のキーです。 |
写真の向きの変更
写真の向きはvoid setRotation(int rotation)を使って変更することができます。向きの計算方法はCamera.Parametersを流用しました。
private void updateCameraParameters() { Camera.Parameters parameters = mCamera.getParameters(); parameters.setRotation(getPictureOrientation()); mCamera.setParameters(parameters); } public int getPictureOrientation() { int orientation = ((Activity)getContext()).getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; switch (orientation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); orientation = (orientation + 45) / 90 * 90; int rotation = 0; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { rotation = (info.orientation - orientation + 360) % 360; } else { // back-facing camera rotation = (info.orientation + orientation) % 360; } return rotation; }
写真の向きの注意点
写真の向きの設定値は一定の条件で例外が発生するので注意が必要です。- 0,90,180,270以外の値を設定した状態でCamera#setParametersを使用すると例外が発生します。
- Camera.Parameters#removeで”rotation”を削除した状態でCamera#setParametersを使用すると例外が発生します。
- カメラプレビューが開始された状態で写真の向きを変更すると即時に反映されます。