我使用新的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指南在此方面不是很有帮助。
答案 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