Camera2のズーム指定|Android開発
android.hardware.camera2
でのズーム方法です。
指定方法
CaptureRequest.Builder
でCaptureRequest.SCALER_CROP_REGION
を設定します。
ズーム最大値の取得方法
CameraCharacteristics
からCameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM
で取得できます。
サンプル
下記サンプルでは中央をズームするように矩形を計算しています。
ズーム矩形算出
int mCurrentZoomLevel = 1;
public void changeZoomLevel(int level) {
// cameraId = 対象のカメラID
CameraManager cameraMgr = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics;
try {
characteristics = cameraMgr.getCameraCharacteristics(cameraId);
} catch (CameraAccessException e) {
e.printStackTrace();
return;
}
// 最大ズームサイズ
float max = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
if ((int) max < level || mCurrentZoomLevel == level) {
return;
}
mCurrentZoomLevel = level;
final Rect activeArraySize = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
if (mCurrentZoomLevel == 1) {
mCropRegion.set(activeArraySize);
} else {
//noinspection ConstantConditions
int cx = activeArraySize.centerX();
int cy = activeArraySize.centerY();
int hw = (activeArraySize.width() >> 1) / mCurrentZoomLevel;
int hh = (activeArraySize.height() >> 1) / mCurrentZoomLevel;
mCropRegion = new Rect(cx - hw, cy - hh, cx + hw, cy + hh);
}
}
プレビュー開始
下記で、camera
はCameraDevice
クラス。captureSession
はCameraCaptureSession
クラスです。
try {
final CaptureRequest.Builder captureBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, mCropRegion);
// その他の設定は割愛
captureSession.setRepeatingRequest(captureBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}