diff --git a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt index cdb7651..7027225 100644 --- a/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt +++ b/package/android/src/main/java/com/mrousavy/camera/core/CameraSession.kt @@ -30,7 +30,7 @@ import com.mrousavy.camera.extensions.capture import com.mrousavy.camera.extensions.createCaptureSession import com.mrousavy.camera.extensions.createPhotoCaptureRequest import com.mrousavy.camera.extensions.openCamera -import com.mrousavy.camera.extensions.zoomed +import com.mrousavy.camera.extensions.setZoom import com.mrousavy.camera.frameprocessor.FrameProcessor import com.mrousavy.camera.parsers.Flash import com.mrousavy.camera.parsers.Orientation @@ -481,13 +481,8 @@ class CameraSession( ) // Zoom - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - captureRequest.set(CaptureRequest.CONTROL_ZOOM_RATIO, zoom) - } else { - val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId!!) - val size = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)!! - captureRequest.set(CaptureRequest.SCALER_CROP_REGION, size.zoomed(zoom)) - } + val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId!!) + captureRequest.setZoom(zoom, cameraCharacteristics) // Torch Mode val torchMode = if (torch == true) CaptureRequest.FLASH_MODE_TORCH else CaptureRequest.FLASH_MODE_OFF diff --git a/package/android/src/main/java/com/mrousavy/camera/extensions/CameraDevice+createPhotoCaptureRequest.kt b/package/android/src/main/java/com/mrousavy/camera/extensions/CameraDevice+createPhotoCaptureRequest.kt index 7a5bec1..0b31970 100644 --- a/package/android/src/main/java/com/mrousavy/camera/extensions/CameraDevice+createPhotoCaptureRequest.kt +++ b/package/android/src/main/java/com/mrousavy/camera/extensions/CameraDevice+createPhotoCaptureRequest.kt @@ -4,7 +4,6 @@ import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraDevice import android.hardware.camera2.CameraManager import android.hardware.camera2.CaptureRequest -import android.os.Build import android.view.Surface import com.mrousavy.camera.parsers.Flash import com.mrousavy.camera.parsers.Orientation @@ -86,12 +85,7 @@ fun CameraDevice.createPhotoCaptureRequest( } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - captureRequest.set(CaptureRequest.CONTROL_ZOOM_RATIO, zoom) - } else { - val size = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)!! - captureRequest.set(CaptureRequest.SCALER_CROP_REGION, size.zoomed(zoom)) - } + captureRequest.setZoom(zoom, cameraCharacteristics) captureRequest.addTarget(surface) diff --git a/package/android/src/main/java/com/mrousavy/camera/extensions/CaptureRequest+setZoom.kt b/package/android/src/main/java/com/mrousavy/camera/extensions/CaptureRequest+setZoom.kt new file mode 100644 index 0000000..ced469d --- /dev/null +++ b/package/android/src/main/java/com/mrousavy/camera/extensions/CaptureRequest+setZoom.kt @@ -0,0 +1,20 @@ +package com.mrousavy.camera.extensions + +import android.hardware.camera2.CameraCharacteristics +import android.hardware.camera2.CaptureRequest +import android.os.Build +import android.util.Range + +fun CaptureRequest.Builder.setZoom(zoom: Float, cameraCharacteristics: CameraCharacteristics) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val zoomRange = cameraCharacteristics.get(CameraCharacteristics.CONTROL_ZOOM_RATIO_RANGE) ?: Range(1f, 1f) + val zoomClamped = zoomRange.clamp(zoom) + this.set(CaptureRequest.CONTROL_ZOOM_RATIO, zoomClamped) + } else { + val maxZoom = cameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM) + val zoomRange = Range(1f, maxZoom ?: 1f) + val size = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)!! + val zoomClamped = zoomRange.clamp(zoom) + this.set(CaptureRequest.SCALER_CROP_REGION, size.zoomed(zoomClamped)) + } +} diff --git a/package/android/src/main/java/com/mrousavy/camera/extensions/Rect+zoomed.kt b/package/android/src/main/java/com/mrousavy/camera/extensions/Rect+zoomed.kt index ce2e3a1..78a3045 100644 --- a/package/android/src/main/java/com/mrousavy/camera/extensions/Rect+zoomed.kt +++ b/package/android/src/main/java/com/mrousavy/camera/extensions/Rect+zoomed.kt @@ -3,12 +3,11 @@ package com.mrousavy.camera.extensions import android.graphics.Rect fun Rect.zoomed(zoomFactor: Float): Rect { - val height = bottom - top - val width = right - left - - val left = this.left + (width / zoomFactor / 2) - val top = this.top + (height / zoomFactor / 2) - val right = this.right - (width / zoomFactor / 2) - val bottom = this.bottom - (height / zoomFactor / 2) - return Rect(left.toInt(), top.toInt(), right.toInt(), bottom.toInt()) + val dx = (width() / zoomFactor / 2).toInt() + val dy = (height() / zoomFactor / 2).toInt() + val left = centerX() - dx + val top = centerY() - dy + val right = centerX() + dx + val bottom = centerY() + dy + return Rect(left, top, right, bottom) }