Настройка масштаба камеры с помощью Camera2 API - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь использовать новый API Camera2 для доступа к настройкам камеры и применения масштабирования.В старом устаревшем API-интерфейсе камеры код был следующим:

Camera.Parameters parameters = mCamera.getParameters();
parameters.setZoom(zoomValue);
mCamera.setParameters(parameters);

Как мы можем добиться того же, учитывая, что CameraManager используется для открытия камеры?

CameraManager.openCamera(cameraId, stateCallback, backgroundHandler);

1 Ответ

0 голосов
/ 29 сентября 2018

Используйте следующий код.Вызовите setZoom с вашей целью CaptureRequest.Builder , чтобы при необходимости создавался модуль предварительного просмотра или прикрепления изображений.

Используйте maxZoom для получения порогана котором ваш пользовательский интерфейс должен вычислить диапазон масштабирования.Диапазон масштабирования всегда будет между DEFAULT_ZOOM_FACTOR и maxZoom .

После вызова setZoom , чтобы активировать новый масштаб, вам все равно нужно отправитьэто к текущему CameraCaptureSession с повторяющимся запросом .

Фрагмент для вычисления нового коэффициента масштабирования:

public final class Zoom
{
    private static final float DEFAULT_ZOOM_FACTOR = 1.0f;

    @NonNull
    private final Rect mCropRegion = new Rect();

    public final float maxZoom;

    @Nullable
    private final Rect mSensorSize;

    public final boolean hasSupport;

    public Zoom(@NonNull final CameraCharacteristics characteristics)
    {
        this.mSensorSize = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);

        if (this.mSensorSize == null)
        {
            this.maxZoom = Zoom.DEFAULT_ZOOM_FACTOR;
            this.hasSupport = false;
            return;
        }

        final Float value = characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);

        this.maxZoom = ((value == null) || (value < Zoom.DEFAULT_ZOOM_FACTOR))
                ? Zoom.DEFAULT_ZOOM_FACTOR
                : value;

        this.hasSupport = (Float.compare(this.maxZoom, Zoom.DEFAULT_ZOOM_FACTOR) > 0);
    }

    public void setZoom(@NonNull final CaptureRequest.Builder builder, final float zoom)
    {
        if (this.hasSupport == false)
        {
            return;
        }

        final float newZoom = MathUtils.clamp(zoom, Zoom.DEFAULT_ZOOM_FACTOR, this.maxZoom);

        final int centerX = this.mSensorSize.width() / 2;
        final int centerY = this.mSensorSize.height() / 2;
        final int deltaX  = (int)((0.5f * this.mSensorSize.width()) / newZoom);
        final int deltaY  = (int)((0.5f * this.mSensorSize.height()) / newZoom);

        this.mCropRegion.set(centerX - deltaX,
                centerY - deltaY,
                centerX + deltaX,
                centerY + deltaY);

        builder.set(CaptureRequest.SCALER_CROP_REGION, this.mCropRegion);
    }
}

Фрагмент для применения новогокомпьютерный зум:

yourCameraSession.setRepeatingRequest(builder.build(), yourPreviewOrCaptureSessionCallback, yourCameraThreadHandler);
...