【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 プレビューサイズ

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

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

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

プレビューサイズ

カメラデバイスから取得するプレビューはサイズを指定することができます。
カメラデバイスには固有のサポートしている複数のプレビューサイズが存在します。
サポート外のプレビューサイズを指定するとCamera#setParameters時に例外が発生します。
Camera.Parameters内にあるプレビューサイズに関連するデータのキーは下記のとおりです。
preview-size-valuesカメラデバイスがサポートしているプレビューサイズリストのキーです。
preview-sizeカメラデバイスに現在設定されているプレビューサイズのキーです。

カメラデバイスがサポートしているプレビューサイズ

カメラデバイスがサポートしているプレビューサイズはList getSupportedPreviewSizes()で取得することができます。
Camera.Sizeはwidthとheightが定義されているCameraの縦と横を表す単純なクラスです。
    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
        for (int i = 0; i < supportedPreviewSizes.size(); i++) {
            Camera.Size supportedPreviewSize = supportedPreviewSizes.get(i);
            Log.d(TAG, "PreviewSize : " + i + " / width-" + supportedPreviewSize.width + " / height-" + supportedPreviewSize.height);
        }
        mCamera.setParameters(parameters);
    }

プレビューサイズの取得と変更

プレビューサイズはCamera.Size getPreviewSize()で現在の値が取得できます。
また、void setPreviewSize(int width, int height)を使ってプレビューサイズを変更することができます。


    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "updateCameraParameters: " + parameters.flatten());
        Camera.Size previewSize = parameters.getPreviewSize();
        Log.d(TAG, "PreviewSize default: " +" / width-" + previewSize.width + " / height-" + previewSize.height);
        List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
        for (int i = 0; i < supportedPreviewSizes.size(); i++) {
            Camera.Size supportedPreviewSize = supportedPreviewSizes.get(i);
            Log.d(TAG, "PreviewSize : " + i + " / width-" + supportedPreviewSize.width + " / height-" + supportedPreviewSize.height);
        }
        int middle = supportedPreviewSizes.size() / 2;
        Camera.Size newPreviewSize = supportedPreviewSizes.get(middle);
        parameters.setPreviewSize(newPreviewSize.width , newPreviewSize.height);
        Log.d(TAG, "PreviewSize new: " +" / width-" + newPreviewSize.width + " / height-" + newPreviewSize.height);
        mCamera.setParameters(parameters);
    }


プレビューサイズの注意点

プレビューサイズの設定値は下記の条件で例外が発生するので注意が必要です。
  1. この設定値はプレビューのサイズであり、Camera#takePictureで取得したデータのサイズには影響がありません。
  2. Camera.Parameters#getSupportedPreviewSizesで取得した組み合わせ以外の値を設定した状態でCamera#setParametersを使用すると例外が発生します。
  3. Camera.Parameters#removeで”preview-size”を削除した状態でCamera#setParametersを使用すると例外が発生します。

まとめ

今回はプレビューサイズに関連する設定値を説明しました。
    private void startPreview() {
        mCamera = Camera.open(this.cameraId);
        updateCameraParameters();
        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mCamera.setDisplayOrientation(getCameraDisplayOrientation());
        mCamera.startPreview();
        updateCameraParameters();
    }

    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        Log.d(TAG, "updateCameraParameters: " + parameters.flatten());
        Camera.Size previewSize = parameters.getPreviewSize();
        Log.d(TAG, "PreviewSize default: " +" / width-" + previewSize.width + " / height-" + previewSize.height);
        List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();


        for (int i = 0; i < supportedPreviewSizes.size(); i++) {
            Camera.Size supportedPreviewSize = supportedPreviewSizes.get(i);
            Log.d(TAG, "PreviewSize : " + i + " / width-" + supportedPreviewSize.width + " / height-" + supportedPreviewSize.height);
        }
        int middle = supportedPreviewSizes.size() / 2;
        Camera.Size newPreviewSize = supportedPreviewSizes.get(middle);
        parameters.setPreviewSize(newPreviewSize.width , newPreviewSize.height);
        Log.d(TAG, "PreviewSize new: " +" / width-" + newPreviewSize.width + " / height-" + newPreviewSize.height);
        mCamera.setParameters(parameters);
    }