ImageCapture не заботится о zoomRatio на камере - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу реализовать функцию масштабирования в своем приложении с помощью CameraX API. Я следовал за этим средний пост , чтобы реализовать масштабирование, и оно работает.

Проблема заключается в том, что когда я получаю захваченное изображение в обратном вызове onCaptureSuccess, изображение не увеличивается.

Вот код, который я использую для реализации масштабирования камеры в onCreate ():

  //ZOOM
    val listener = object : ScaleGestureDetector.SimpleOnScaleGestureListener() {
        override fun onScale(detector: ScaleGestureDetector): Boolean {
            val zoomRatio = camera?.cameraInfo?.zoomState?.value?.zoomRatio ?: 0f
            val scale = zoomRatio * detector.scaleFactor
            camera?.cameraControl?.setZoomRatio(scale)
            return true
        }
    }

    scaleDetector = ScaleGestureDetector(context, listener)

И в методе "bindCameraUseCases ()":

   previewCamera.setOnTouchListener { _, event ->
            scaleDetector.onTouchEvent(event)
        }

полный метод, если необходимо:

 /** Declare and bind preview, capture and analysis use cases */
fun bindCameraUseCases() {
    // Get screen metrics used to setup camera for full screen resolution
    val metrics = DisplayMetrics().also { previewCamera.display.getRealMetrics(it) }
    Log.d(TAG, "Screen metrics: ${metrics.widthPixels} x ${metrics.heightPixels}")

    val rotation = previewCamera.display.rotation

    // Bind the CameraProvider to the LifeCycleOwner
    val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
    val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
    cameraProviderFuture.addListener(Runnable {

        // CameraProvider
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

        // Preview
        preview = Preview.Builder()
            .setTargetRotation(rotation)
            .build()

        previewCamera.preferredImplementationMode =
            PreviewView.ImplementationMode.TEXTURE_VIEW  // when setting to TEXTURE_VIEW, preview doesnt take full screen on back pressed

        previewCamera.setOnTouchListener { _, event ->
            scaleDetector.onTouchEvent(event)
        }

        // Default PreviewSurfaceProvider
        preview?.setSurfaceProvider(previewCamera.createSurfaceProvider(camera?.cameraInfo))


        val screenAspectRatio = aspectRatio(metrics.widthPixels, metrics.heightPixels)


        // ImageCapture
        imageCapture = ImageCapture.Builder()
            .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
            .setTargetAspectRatio(screenAspectRatio)
            .setTargetRotation(rotation)
            .build()

        // ImageAnalysis
        imageAnalyzer = ImageAnalysis.Builder()
            .setTargetAspectRatio(screenAspectRatio)
            .setTargetRotation(rotation)
            .build()

        cameraProvider.unbindAll()
        try {
            camera = cameraProvider.bindToLifecycle(
                this as LifecycleOwner, cameraSelector, preview, imageCapture, imageAnalyzer
            )
        } catch (exc: Exception) {
            Log.e(TAG, "Use case binding failed", exc)
        }

    }, mainExecutor)
}

Как я уже упоминал, zoom работает, но затем в onCaptureSucess ImageProxy не увеличивается.

override fun onCaptureSuccess(image: ImageProxy) {
                        image.use { image ->
                            savedBitmap = image.imageProxyToBitmap()
                            ///...

                }
            }

Вот функция расширения для извлечения растрового изображения из imageProxy:

fun ImageProxy.imageProxyToBitmap(): Bitmap {

val buffer = this.planes[0].buffer
buffer.rewind()
val bytes = ByteArray(buffer.capacity())
buffer.get(bytes)
val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
val matrix = Matrix()
matrix.postRotate(90f)

return Bitmap.createBitmap(bitmap, 0, 0,bitmap.width,bitmap.height, matrix, true)

} ​​

Вот мои зависимости:

    // CameraX core library
def camerax_version = "1.0.0-beta02"
implementation "androidx.camera:camera-core:$camerax_version"

// CameraX Camera2 extensions
implementation "androidx.camera:camera-camera2:$camerax_version"

// CameraX Lifecycle library
implementation "androidx.camera:camera-lifecycle:$camerax_version"

// CameraX View class
implementation "androidx.camera:camera-view:1.0.0-alpha09"

Спасибо за вашу помощь ?

1 Ответ

0 голосов
/ 10 апреля 2020

не знаю, почему это происходит, но мы не можем воспроизвести проблему. В моем тесте ImageCapture всегда захватывает изображение с примененным увеличением.

В настоящее время я подозреваю, что это может быть проблема устройства. Это может быть полезно, если вы можете указать имя устройства. Также будет полезно, если вы сможете проверить это на других устройствах.

...