Camera2 キャプチャサイズの取得|Android開発
Camera2 APIでの各キャプチャ画像サイズ取得方法です。
それぞれTextureViewがavailableになる前でも実行可能です。
プレビューサイズの取得
SurfaceTexture指定で取得
(Surface
をaddTarget
してプレビューする場合)
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;
}
};