【今更だけどandroid.hardware.Cameraを使う】Camera.Parametersの設定値 プレビューのフォーマット

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

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

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

プレビューのフォーマット

カメラデバイスから取得するプレビューのプレビューのフォーマットを指定することができます。
プレビューのフォーマットはImageFormatで指定することができます。
Camera.Parameters内にあるプレビューのフォーマットに関連するデータのキーは下記のとおりです。
preview-format-valuesカメラデバイスがサポートしているプレビューのフォーマットリストのキーです。
preview-formatカメラデバイスに現在設定されているプレビューのフォーマットのキーです。

カメラデバイスがサポートしているプレビューのフォーマット

カメラデバイスがサポートしているプレビューのフォーマットはList getSupportedPreviewFormats()で取得することができます。
取得できる値はImageFormatで定義されているint型の定数です。
今回はImageFormatの定数を文字列に変換するメソッドも作成しました。

    private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp";
    private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp";
    private static final String PIXEL_FORMAT_YUV422I = "yuv422i-yuyv";
    private static final String PIXEL_FORMAT_YUV420P = "yuv420p";
    private static final String PIXEL_FORMAT_RGB565 = "rgb565";
    private static final String PIXEL_FORMAT_JPEG = "jpeg";

    public static String pixelFormatForCameraFormat(int value) {
        switch (value) {
            case ImageFormat.NV16:
                return PIXEL_FORMAT_YUV422SP;
            case ImageFormat.NV21:
                return PIXEL_FORMAT_YUV420SP;
            case ImageFormat.YUY2:
                return PIXEL_FORMAT_YUV422I;
            case ImageFormat.YV12:
                return PIXEL_FORMAT_YUV420P;
            case ImageFormat.RGB_565:
                return PIXEL_FORMAT_RGB565;
            case ImageFormat.JPEG:
                return PIXEL_FORMAT_JPEG;
        }
        return "";
    }

    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        List<Integer> supportedPreviewFormats = parameters.getSupportedPreviewFormats();
        for (int i = 0; i < supportedPreviewFormats.size(); i++) {
            Log.d(TAG, "SupportedPreviewFormat: " + pixelFormatForCameraFormat(supportedPreviewFormats.get(i)));
        }
        mCamera.setParameters(parameters);
    }

プレビューのフォーマットの取得と変更

プレビューのフォーマットはint getPreviewFormat()で現在の値が取得できます。
また、void setPreviewFormat(int pixel_format)を使ってプレビューのフォーマットを変更することができます。


    private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp";
    private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp";
    private static final String PIXEL_FORMAT_YUV422I = "yuv422i-yuyv";
    private static final String PIXEL_FORMAT_YUV420P = "yuv420p";
    private static final String PIXEL_FORMAT_RGB565 = "rgb565";
    private static final String PIXEL_FORMAT_JPEG = "jpeg";

    public static String pixelFormatForCameraFormat(int value) {
        switch (value) {
            case ImageFormat.NV16:
                return PIXEL_FORMAT_YUV422SP;
            case ImageFormat.NV21:
                return PIXEL_FORMAT_YUV420SP;
            case ImageFormat.YUY2:
                return PIXEL_FORMAT_YUV422I;
            case ImageFormat.YV12:
                return PIXEL_FORMAT_YUV420P;
            case ImageFormat.RGB_565:
                return PIXEL_FORMAT_RGB565;
            case ImageFormat.JPEG:
                return PIXEL_FORMAT_JPEG;
        }
        return "";
    }

    private void updateCameraParameters() {
        Camera.Parameters parameters = mCamera.getParameters();
        List<Integer> supportedPreviewFormats = parameters.getSupportedPreviewFormats();
        for (int i = 0; i < supportedPreviewFormats.size(); i++) {
            Log.d(TAG, "SupportedPreviewFormat: " + pixelFormatForCameraFormat(supportedPreviewFormats.get(i)));
        }
        Log.d(TAG, "PreviewFormat: " + pixelFormatForCameraFormat(parameters.getPreviewFormat()));
        parameters.setPreviewFormat(supportedPreviewFormats.get(0));
        mCamera.setParameters(parameters);
    }


プレビューのフォーマットの注意点

プレビューのフォーマットの設定値は下記の条件で例外が発生するので注意が必要です。
  1. Camera.Parameters#getSupportedPreviewFormatsで取得した値以外の値を設定した状態でCamera#setParametersを使用すると例外が発生します。
  2. Camera.Parameters#removeで”preview-format”を削除した状態でCamera#setParametersを使用するとデフォルト値が使用されるようです。
  3. カメラプレビューが開始された状態でプレビューのフォーマットを変更すると例外が発生します。