Camera2のズーム指定|Android開発

      2018/05/21

android.hardware.camera2でのズーム方法です。

指定方法

CaptureRequest.BuilderCaptureRequest.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);
    }
}

プレビュー開始

下記で、cameraCameraDeviceクラス。captureSessionCameraCaptureSessionクラスです。

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();
}

 - Android