代码之家  ›  专栏  ›  技术社区  ›  user924

使用camera2时获取当前缩放值

  •  0
  • user924  · 技术社区  · 6 年前

    使用传统摄像头API( android.hardware.Camera )我可以用下一行得到当前的缩放级别

    Camera.Parameters p = mCamera.getParameters();
    int zoom = p.getZoomRatios().get(p.getZoom());
    

    如何使用Camera2 API( android.hardware.camera2 )?

    CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
    ...
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Perraco    6 年前

    我发现最简单的方法知道当前的变焦实际上是随时跟踪它的变化。

    下一个缩放控制器既可用于计算新的缩放,也可用于获取当前缩放,而当前缩放实际上只是传递给.set()方法的缓存值:

    public final class Zoom
    {
        private static final float DEFAULT_ZOOM_FACTOR = 1.0f;
    
        @NonNull
        private final Rect mCropRegion = new Rect();
    
        public final float maxZoom;
    
        private float mCurrentZoomFactor = Zoom.DEFAULT_ZOOM_FACTOR;
    
        @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 set(@NonNull final CaptureRequest.Builder builder, final float newZoom)
        {
            if (this.hasSupport == false)
            {
                return;
            }
    
            this.mCurrentZoomFactor = MathUtils.clamp(newZoom, 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()) / this.mCurrentZoomFactor);
            final int deltaY  = (int)((0.5f * this.mSensorSize.height()) / this.mCurrentZoomFactor);
    
            this.mCropRegion.set(centerX - deltaX,
                    centerY - deltaY,
                    centerX + deltaX,
                    centerY + deltaY);
    
            builder.set(CaptureRequest.SCALER_CROP_REGION, this.mCropRegion);
        }
    
        public float get()
        {
            return this.mCurrentZoomFactor;
        }
    }
    

    在调用zoom.set(…)之后,使用下一个片段将新的缩放因子提交到活动的照相机会话中并使其生效。无论是活动预览会话,还是拍照时的捕获会话,都需要执行以下操作:

    yourCameraSession.setRepeatingRequest(builder.build(), yourPreviewOrCaptureSessionCallback, yourCameraThreadHandler);
    
    推荐文章