java - 使用Camera2 API设置相机变焦

标签 java android android-camera2

我正在尝试使用新的 Camera2 API 来访问相机设置并应用缩放。 在旧的已弃用的 Camera API 中,代码如下:

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

考虑到 CameraManager,我们如何才能实现同样的目标 是用来打开相机的?

CameraManager.openCamera(cameraId, stateCallback, backgroundHandler);

最佳答案

使用下一个代码。使用您的目标 CaptureRequest.Builder 调用 setZoom ,以便在需要时使用预览或图片定位构建器。

使用 ma​​xZoom 获取 UI 应计算缩放范围的阈值。 缩放范围将始终在 DEFAULT_ZOOM_FACTORma​​xZoom 之间。

调用setZoom后,要使新的缩放处于 Activity 状态,您仍然需要将其发送到当前的 CameraCaptureSession带有重复请求

计算新缩放系数的代码 fragment :

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

应用新的计算缩放的代码 fragment :

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

关于java - 使用Camera2 API设置相机变焦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52568987/

相关文章:

java - 如何限制 cron 触发器在 quartz 调度程序中触发时仅执行一次作业

java - 如何在java中对所有元素按升序排序的二维数组

android - 如何让用户在应用程序启动时选择启动哪个Activity?

Android Camera2 API 预览有时会失真

java - 以编程方式创建布局时在 Camera2 API 中预览拉伸(stretch)

android - 如何使用 Camera2 API android 提高捕获的图像分辨率?

java - 在 Android 应用程序中隐藏 API URL - 2018

java - 即使在 Struts 2.3.24 中添加 commons-lang3 库后也出现 NoClassDefFoundError

java - joda 时区 id 与 java 时区 id 相同吗?

android - 让 NFC/Beam 更加自动化