访问CameraX中的图像数据缓冲区

时间:2019-12-10 20:52:55

标签: android image pixel android-camerax

我使用新的CameraX API拍摄这样的照片:

imageButton.setOnClickListener{
            val file = File(externalMediaDirs.first(),
                "${System.currentTimeMillis()}.jpg")

            imageCapture.takePicture(executor, object :
                ImageCapture.OnImageCapturedListener() {
                override fun onCaptureSuccess(
                    image: ImageProxy,
                    rotationDegrees: Int)
                {

                    // DO I NEED TO USE 'image' TO ACCESS THE IMAGE DATA FOR MANIPULATION (e.g. image.planes)

                }

                override fun onError(
                    imageCaptureError: ImageCapture.ImageCaptureError,
                    message: String,
                    cause: Throwable?
                ) {
                    val msg = "Photo capture failed: $message"
                    Log.e("CameraXApp", msg, cause)

                }
            })

            imageCapture.takePicture(file, executor,
                object : ImageCapture.OnImageSavedListener {

                    override fun onError(
                        imageCaptureError: ImageCapture.ImageCaptureError,
                        message: String,
                        exc: Throwable?
                    ) {
                        val msg = "Photo capture failed: $message"
                        Log.e("CameraXApp", msg, exc)

                    }

                    override fun onImageSaved(file: File) {
                        val msg = "Photo capture succeeded: ${file.absolutePath}"
                        Log.d("CameraXApp", msg)



                    }
                }
        }

我想在捕获图像时对Renderscript进行一些图像处理。但是我不知道如何访问所捕获图像的像素。 有人可以提供解决方案吗? 我在onCaptureSuccess()回调中使用image.planes进行了尝试(请参见评论)

我必须承认我是新手,也不知道真正的飞机是什么。在此之前,我只使用位图(使用Renderscript对位图进行一些图像处理)。有没有一种方法可以将帧/图像转换为位图,并在将其另存为文件之前“即时”对其进行某种图像处理?如果是,怎么办?官方的CameraX指南在此方面不是很有帮助。

1 个答案:

答案 0 :(得分:0)

这可能是很晚的答案,但是答案在ImageCapture回调中。

您获得的图片带有

val image = imageProxy.image

请注意,仅当您具有YUV格式的图像时,此功能才起作用,为了配置摄像机,您可以使用

imageCapture = ImageCapture.Builder()
                .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
                .setBufferFormat(ImageFormat.YUV_420_888)
                 ...
                .build()

现在可以获得image.planes

默认图像格式为JPEG 您可以使用

访问缓冲区
buffer: ByteBuffer = imageProxy.image.planes[0].getBuffer()

,如果您打算将其设置为YUV

val image = imageProxy.image
val yBuffer = image.planes[0].buffer // Y
val uBuffer = image.planes[1].buffer // U
val vBuffer = image.planes[2].buffer // V