こんにちは、KID.Aです。
今回のブログはAndroidのCameraのパラメータ設定で気をつけなければいけないことを記載します。
AndroidのAPIを使ってカメラアプリを作る際に2つの方法でアプリを作成できます。1つ目はIntentを使ってカメラアプリケーションと連携する方法で、2つ目はCamera(5.0からはCamera2)のAPIを使って自前のカメラを実装する方法です。
撮影後の写真を加工したいだけなら1つ目の方法で大丈夫ですが、リアルタイムに画像を取得して加工したい場合や自作カメラを作る場合は2つ目の方法をとることになります。
2つ目のCameraのAPIを使う場合、以下の点に注意が必要になります。
・プレビューサイズとピクチャーサイズの比率に気をつける
比率を意識しないと思わぬ罠にはまってしまいます。
CameraのAPIを使用した方ならわかると思いますが、CameraのAPIにはプレビューサイズとピクチャーサイズという設定ができます。
プレビューサイズ、ピクチャーサイズは何かといわれれば
撮影中の画像 = プレビューサイズ
撮影後の画像 = ピクチャーサイズ
とイメージしてもらえればわかりやすいと思います。
プレビューサイズとピクチャーサイズに分かれているのは、撮影中のリアルタイムが求められるの処理に重たい画像データを毎ms取得していたら処理動作に影響してしてしまうためだと思われます。
下記はCamera.ParametersのAPIです。
http://developer.android.com/intl/ja/reference/android/hardware/Camera.Parameters.html
設定できるプレビューサイズ、ピクチャーサイズは以下のように取得できます。
Camera.Parameters params = mCamera.getParameters(); List previewSizes = params.getSupportedPreviewSizes(); List pictureSizes = params.getSupportedPictureSizes();
設定方法は以下のようにします。
Camera.Parameters params = camera.getParameters(); params.setPreviewSize(previewSize.width, previewSize.height); params.setPictureSize(pictureSize.width, pictureSize.height); camera.setParameters(params);
ただしここで、異なる対比のサイズを指定してしまうと、撮影中に写っていた箇所が撮影後の写真では写っていなかったり、逆に撮影中に写っていない箇所が撮影後の写真で写っていることが起こってしまいます。
これはSO-02Fでプレビューサイズを(4:3)、ピクチャーサイズを(16:9)の場合の写真になります。撮影中には写っている横幅が撮影後には写っていないのがわかります。
プレビューサイズ:4:3 (960 x 720) | ピクチャーサイズ:16:9 (3840 x 2160) |
---|---|
![]() |
![]() |
現状の端末だと、3:2、4:3、5:3、9:6、16:9などが多いのですが、この中でSO-02Fは3:2、4:3、16:9のパターンしかないためそれらを比較してみました。(ピクチャーサイズ:3:2は小さいサイズしかなかったのでそちらを使っています)
プレビューサイズ:3:2 (720 x 480) | ピクチャーサイズ:3:2 (480 x 320) |
---|---|
![]() |
![]() |
プレビューサイズ:3:2 (720 x 480) | ピクチャーサイズ:4:3 (3264 x 2448) |
---|---|
![]() |
![]() |
プレビューサイズ:3:2 (720 x 480) | ピクチャーサイズ:16:9 (3840 x 2160) |
---|---|
![]() |
![]() |
プレビューサイズ:4:3 (960 x 720) | ピクチャーサイズ:3:2(480 x 320) |
---|---|
![]() |
![]() |
プレビューサイズ:4:3 (960 x 720) | ピクチャーサイズ:4:3 (3264 x 2448) |
---|---|
![]() |
![]() |
プレビューサイズ:4:3 (960 x 720) | ピクチャーサイズ:16:9 (3840 x 2160) |
---|---|
![]() |
![]() |
プレビューサイズ:16:9 (1280 x 720) | ピクチャーサイズ:3:2 (480 x 320) |
---|---|
![]() |
![]() |
プレビューサイズ:16:9 (1280 x 720) | ピクチャーサイズ:4:3 (3264 x 2448) |
---|---|
![]() |
![]() |
プレビューサイズ:16:9 (1280 x 720) | ピクチャーサイズ:16:9 (3840 x 2160) |
---|---|
![]() |
![]() |
比較結果を見てもらうとわかるように同じ比率でないものは縦、横、どちらかがきれています。
しかしながら機種によっては上記以外のサイズを設定できたり、必ずしも縦、横がどちらかがきれるパターンだけではなく、縦、横、両方がきれてしまうパターンもありました。こちらは今後のブログで記載していきます。Cameraのプレビューサイズとピクチャーサイズの機種依存問題で記載しました。
上記のようなことがあるため、プレビューサイズとピクチャーサイズの比率は同じにした方がよいです。
※一部の機種ではプレビューサイズとピクチャーサイズの比率が同じですが撮影中と撮影後の写真サイズが異なるものがあったりします。そちらも今後のブログで記載していきます。Cameraのプレビューサイズとピクチャーサイズの機種依存問題で記載しました。
以下はプレビューサイズとピクチャーサイズの同一の比率を判定する処理になります。
List previewSizes = params.getSupportedPreviewSizes(); List pictureSizes = params.getSupportedPictureSizes(); // プレビューサイズとピクチャーサイズが同一比率の解像度を選択する for (Size picSiz: pictureSizes) { for (Size preSiz: previewSizes) { if (picSiz.width * preSiz.height == preSiz.width * picSiz.height) { // ここでpreSizとpicSizが同一の比率と判定できます } } }
これで大体の機種で撮影時と撮影後の撮影範囲が同じになります。