【问题标题】:Camerax Take Picture image.planes always emptyCamerax 拍照 image.planes 总是空的
【发布时间】:2020-05-05 09:42:40
【问题描述】:

我尝试为内存使用拍摄图像,但 imageProxy.planes[0].remaining() 始终为 0。所以我无法从结果中获取位图。这是一个错误还是我做错了什么?

这是我绑定相机的方法:

private fun bindPreview(cameraProvider: ProcessCameraProvider) {
    val cameraSelector: CameraSelector = CameraSelector.Builder()
        .requireLensFacing(CameraSelector.LENS_FACING_BACK)
        .build()

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

    imageAnalyzer = ImageAnalysis.Builder()
        .setTargetAspectRatio(aspectRatio)
        .setTargetRotation(rotation)
        .build()

    imageAnalyzer?.setAnalyzer(cameraExecutor, ImageAnalysis.Analyzer { image ->
        viewModel.analyzeImage(image)
    })

    preview = Preview.Builder()
        .setTargetAspectRatio(aspectRatio)
        .setTargetRotation(rotation)
        .build()

    cameraProvider.unbindAll()

    try {
        camera = cameraProvider.bindToLifecycle(
            this as LifecycleOwner,
            cameraSelector,
            preview,
            imageCapture,
            imageAnalyzer
        )
        preview?.setSurfaceProvider(binding.previewView.createSurfaceProvider(camera?.cameraInfo))
    } catch (e: Exception) {
        Timber.e(e, "Could not bind camera.")
    }
}

这是我尝试捕获图像的代码:

imageCapture?.takePicture(cameraExecutor, object : ImageCapture.OnImageCapturedCallback() {
        override fun onCaptureSuccess(image: ImageProxy) {
            Log.d(
                "test",
                "image -> height: ${image.height} | width: ${image.width} | format: ${image.format}"
            )
            Log.d(
                "test",
                "image -> planes.size ${image.planes.size} | planes[0].buffer.remaining ${image.planes[0].buffer.remaining()}"
            )
            Log.d(
                "test",
                "image -> image.image?.planes.size ${image.image?.planes?.size} | image.image?.planes[0].buffer.remaining ${image.image!!.planes[0].buffer.remaining()}"
            )

            // some code here

            image.close()
        }

        override fun onError(exception: ImageCaptureException) {
            super.onError(exception)
            Timber.e(exception.cause, "Could not capture image.")
        }
    })
}

拍摄的图像的高度和宽度似乎是正确的。

【问题讨论】:

    标签: android android-camerax


    【解决方案1】:

    首先,不要对image.image!!进行操作。 尝试倒带ByteBuffer 然后检查remaining() 试试:

    val buffer = image.planes[0].buffer
    buffer.rewind()
    

    【讨论】:

    • 嗨,image.image!只是为了测试目的。 buffer.rewind() 成功了!非常感谢。
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多