【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 ズーム

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。

Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はCamera.Parametersのズームに関連する設定値を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。

ズーム

カメラデバイスには数段階のズームができる機能が実装されているものがあります。 カメラデバイスから取得するプレビュー・キャプチャデータのズームステップを指定することができます。
Camera.Parameters内にあるズームに関連するデータのキーは下記のとおりです。
zoom-supportedカメラデバイスがズーム機能をサポートしているかどうかのキーです。
smooth-zoom-supportedカメラデバイスがスムーズズーム機能をサポートしているかどうかのキーです。
max-zoomカメラデバイスがサポートしている最大ズームステップ値のキーです。
zoom-ratiosカメラデバイスがサポートしているズームステップに対応する倍率値リストのキーです。
zoomカメラデバイスに現在設定されているズームステップ値のキーです。

カメラデバイスのズーム機能の有無

カメラデバイスにズーム機能が有るかどうかを判断するにはboolean isZoomSupported()を使う必要があります。
trueの場合はズーム機能がありますが、falseの場合はズーム機能はありません。
ズーム機能関連のメソッドを使用する前にCamera.Parameters#isZoomSupportedで確認する必要があります。

また、ズーム機能とは別にスムーズズーム機能というものがあります。

スムーズズーム機能とは、現在のズームステップから指定のズームステップへと一段階ずつズームを進める機能です。
trueの場合はCamera#startSmoothZoomを使うことで使用できますが、falseの場合は使用できません。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "ZoomSupported:" + parameters.isZoomSupported());
        Log.d(TAG, "SmoothZoomSupported: " + parameters.isSmoothZoomSupported());
        mCamera.setParameters(parameters);
    }


最大ズームステップとズーム率リストの取得

ズーム機能があるカメラデバイスでは数段階のズームが可能です。
このズーム可能な段階数をズームステップと呼び、0以上の整数値で表されます。最大ズームステップはint getMaxZoom()で取得することができます。
また、ズームステップをインデックスとしたズーム率リストをList getZoomRatios()で取得することができます。
ズーム率リストは実際の倍率に100を掛け合わした数値が使用されています。例えば、ズーム率リストに320という値がある場合、3.2倍の倍率でズームすることが可能ということになります。

    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "ZoomSupported:" + parameters.isZoomSupported());
        List<Integer> zoomRatios = parameters.getZoomRatios();
        for (int i = 0; i < zoomRatios.size(); i++) {
            Log.d(TAG, "ZoomRatios: " + i + " - "+ zoomRatios.get(i));
        }

        Log.d(TAG, "MaxZoom: " + parameters.getMaxZoom());
        Log.d(TAG, "SmoothZoomSupported: " + parameters.isSmoothZoomSupported());
        mCamera.setParameters(parameters);
    }

ズームステップの取得と変更

ズームステップはint getZoom()で現在の値が取得できます。
また、void setZoom(int value)を使ってズームステップを変更することができます。
ズームステップはCamera.Parameters#getZoomRatiosのインデックスとして使われ、ズーム倍率はカメラプレビューやカメラデータに適用されます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "ZoomSupported:" + parameters.isZoomSupported());
        List<Integer> zoomRatios = parameters.getZoomRatios();
        for (int i = 0; i < zoomRatios.size(); i++) {
            Log.d(TAG, "ZoomRatios: " + i + " - "+ zoomRatios.get(i));
        }
        Log.d(TAG, "MaxZoom: " + parameters.getMaxZoom());
        Log.d(TAG, "Zoom: " + parameters.getZoom());
        parameters.setZoom(parameters.getMaxZoom() / 2);
        Log.d(TAG, "SmoothZoomSupported: " + parameters.isSmoothZoomSupported());
        mCamera.setParameters(parameters);
    }


ズームステップの注意点

ズームステップの設定値は下記の条件で例外が発生するので注意が必要です。
  1. 0からCamera.Parameters#getMaxZoom以外の値を設定した状態でCamera#setParametersを使用すると例外が発生します。
  2. Camera.Parameters#removeで”zoom”を削除した状態でCamera#setParametersを使用するとデフォルト値が使用されるようです。
  3. カメラプレビューが開始された状態でズームステップを変更すると即時に反映されます。