Camera2 キャプチャサイズの取得|Android開発

      2018/09/05

Camera2 APIでの各キャプチャ画像サイズ取得方法です。
それぞれTextureViewがavailableになる前でも実行可能です。

プレビューサイズの取得

SurfaceTexture指定で取得

(SurfaceaddTargetしてプレビューする場合)

public static List<Size> getSupportedPreviewSizes(Context context, String cameraId) {
    List<Size> previewSizes = new ArrayList<>();
    CameraManager cameraManager =
        (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    try {
        CameraCharacteristics characteristics =
            cameraManager.getCameraCharacteristics(cameraId);
        StreamConfigurationMap map =
            characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        if(map == null) {
            return previewSizes;
        }
        previewSizes = Arrays.asList(map.getOutputSizes(SurfaceTexture.class));
        Collections.sort(previewSizes, SizeComparator);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    return previewSizes;
}

フォーマット指定で取得

public static List<Size> getSupportedPreviewSizes(Context context, String cameraId) {
    List<Size> previewSizes = new ArrayList<>();
    CameraManager cameraManager =
        (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    try {
        CameraCharacteristics characteristics =
            cameraManager.getCameraCharacteristics(cameraId);
        StreamConfigurationMap map =
            characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        if(map == null) {
            return previewSizes;
        }
        previewSizes = Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888));
        Collections.sort(previewSizes, SizeComparator);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    return previewSizes;
}

撮影サイズの取得

プレビューサイズの取得と同じ手順です。
ImageFormatによってプレビューとの差分が出たりします。

public static List<Size> getSupportedPictureSizes(Context context, String cameraId) {
    List<Size> pictureSizes = new ArrayList<>();
    CameraManager cameraManager =
        (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
    try {
        CameraCharacteristics characteristics =
            cameraManager.getCameraCharacteristics(cameraId);
        StreamConfigurationMap map =
            characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
        if(map == null) {
            return pictureSizes;
        }
        pictureSizes = Arrays.asList(map.getOutputSizes(ImageFormat.JPEG));
        Collections.sort(pictureSizes, SizeComparator);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    return pictureSizes;
}

ソート処理

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

private static final Comparator<Size> SizeComparator = new Comparator<Size>() {

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

 - Android