【今更だけどandroid.hardware.Cameraを使う】ズーム機能を追加する

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

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

Android端末に実装されているカメラデバイスは固有の性能があります。
そのため、ある端末では出来るのに別の端末では出来ないということが多々あります。
今回はズーム機能を説明します。
下記の実装はすべて前回までに作ったクラスを修正しています。
ズームするには二つの方法があります。
  • Camera.Parameters#setZoom(int value)を使用してカメラのズームステップを直接変更します。
  • Camera#startSmoothZoom(int value)を使用して現在のズームステップを任意のズームステップに変更します。

Camera.Parameters#setZoom(int value)の使い方

Camera.Parameters#setZoom(int value)は以前説明しました。
任意のズームステップに直接変化させることができます。

    public void cameraParametersZoom(int zoomStep) {
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setZoom(zoomStep);
        mCamera.setParameters(parameters);
    }

Camera#startSmoothZoom(int value)の使い方

final void startSmoothZoom(int value)は現在のズームステップから任意のズームステップに1ステップずつアニメーション付で変化するスムーズズームを実行することができます。
Camera#startSmoothZoomによるズームステップの変化はfinal void setZoomChangeListener(Camera.OnZoomChangeListener listener)を使うことで、ズームステップが1変化した時に呼び出されるコールバックインターフェースを設定することができます。
また、final void stopSmoothZoom()はスムーズズームを中断するためのメソッドです。
Camera.OnZoomChangeListener#onZoomChange(int zoomValue, boolean stopped, Camera camera)はスムーズズームでズームステップが1ステップ変化した時に呼ばれます。
int zoomValueは現在のズームステップ値です。boolean stoppedはスムーズズームの最後の変化時はtrueを、変化の途中はfalseが渡されます。

    public void smoothZoom(int zoomStep) {
        mCamera.setZoomChangeListener(new Camera.OnZoomChangeListener() {
            @Override
            public void onZoomChange(int zoomValue, boolean stopped, Camera camera) {
                Log.d(TAG, "onZoomChange: zoomValue-" + zoomValue);
                Log.d(TAG, "onZoomChange: stopped-" + stopped);

            }
        });
        mCamera.startSmoothZoom(zoomStep);
    }

    public void stopSmoothZoom(){
        if(mCamera != null && mCamera.getParameters().isSmoothZoomSupported()) {
            mCamera.stopSmoothZoom();
        }
    }

二つのズーム方法

Android端末は二つのズーム方法をサポートしているかもしれないし、全くサポートしていないかもしれません。
そのため、ズームを行う前には必ずズームのサポート状況を調べる必要があります。

    public void zoom(int zoomStep) {
        if (mCamera.getParameters().isSmoothZoomSupported()) {
            Log.d(TAG, "zoom: SmoothZoomSupported" );
            smoothZoom(zoomStep);
        } else if(mCamera.getParameters().isZoomSupported()) {
            Log.d(TAG, "zoom: ZoomSupported" );
            cameraParametersZoom(zoomStep);
        } else {
            Log.d(TAG, "zoom: not Supported" );
        }
    }