Camera実装時によく使う処理のサンプル|Android開発

カメラ(android.hardware.Camera)実装時によく使う処理をまとめてみました。

カメラがサポートするプレビューサイズの取得

import android.util.Size;

public static List<Size> getSupportedPreviewSizes(int cameraId) {
    Camera camera;
    ArrayList<Size> resultSizes = new ArrayList<>();

    camera = Camera.open(cameraId);
    if (camera == null) {
        return resultSizes;
    }

    try {
        Camera.Parameters parameters = camera.getParameters();
        List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
        Collections.sort(previewSizes, CameraSizeComparator);

        /* プレビューサイズ. */
        for (Camera.Size sz : previewSizes) {
            resultSizes.add(new Size(sz.width, sz.height));
        }
        return resultSizes;
    } finally {
        camera.release();
    }
}

カメラがサポートする撮影サイズの取得

import android.util.Size;

public static List<Size> getSupportedPictureSizes(int cameraId) {
    Camera camera;
    ArrayList<Size> resultSizes = new ArrayList<>();

    camera = Camera.open(cameraId);
    if (camera == null) {
        return resultSizes;
    }

    try {
        Camera.Parameters parameters = camera.getParameters();
        List<Camera.Size> pictureSizes = parameters.getSupportedPictureSizes();
        Collections.sort(pictureSizes, CameraSizeComparator);

        /* 撮影サイズ. */
        for (Camera.Size sz : pictureSizes) {
            resultSizes.add(new Size(sz.width, sz.height));
        }
        return resultSizes;
    } finally {
        camera.release();
    }
}

ソート処理

上記で使用したサイズ比較オブジェクトです。下記はサイズを降順に並べ替えます。

protected static final java.util.Comparator<Camera.Size> CameraSizeComparator =
    new java.util.Comparator<Camera.Size>() {

    @Override
    public int compare(Camera.Size lhs, Camera.Size rhs) {
        int result = rhs.width - lhs.width;
        if (result == 0) {
            result = rhs.height - lhs.height;
        }
        return result;
    }
};

ディスプレイ回転度の計算

Camera.setDisplayOrientation()
Camera.Parameters.setRotation()
に渡す値の計算方法。
下記でdegreesがパラメータの値となります。

private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
    ORIENTATIONS.append(Surface.ROTATION_0, 0);
    ORIENTATIONS.append(Surface.ROTATION_90, 90);
    ORIENTATIONS.append(Surface.ROTATION_180, 180);
    ORIENTATIONS.append(Surface.ROTATION_270, 270);
}

protected int calculateDegrees() {
    // Fragmentクラスの場合.
    int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
    int displayOrientation = ORIENTATIONS.get(rotation);

    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    Camera.getCameraInfo(cameraId, cameraInfo);

    int degrees = 0;
    if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        degrees = (cameraInfo.orientation + displayOrientation) % 360;
        degrees = (360 - degrees) % 360;
    }
    return (cameraInfo.orientation - displayOrientation + 360) % 360;
}
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

スポンサードリンク

関連コンテンツ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です