kotlin android Camera2采取帧和转换为位图

km0tfn4u  于 2023-02-05  发布在  Kotlin
关注(0)|答案(1)|浏览(182)

我正在尝试将一个帧格式转换为位图,但总是收到null。有人能帮助我解决这个问题吗?
我正在Kotlin使用camera2

private val imageListener = ImageReader.OnImageAvailableListener { reader ->
        val image = reader?.acquireLatestImage()  

        try {
            val imageBytes = image?.planes?.first()?.buffer?.toByteArray()
            val imageBase64 = Base64.encodeToString(imageBytes, Base64.DEFAULT)
            Log.d(TAG, imageBase64)}
        catch (e: Exception) {
            e.printStackTrace()
        }
        image?.close()
    }
}

我尝试将其更改为base46,但base64无法解码。当我尝试使用PNG或JPG在线解码时,我总是得到一个400x400透明色的图像。

hs1rzwqc

hs1rzwqc1#

我假设捕获请求被配置为将输出编码为JPEG格式?
如果是这样的话,你需要将字节读入一个字节数组,然后将jpeg转换为Bitmap。

val buffer = image?.?planes[0]?.buffer ?: return
val jpegData = ByteArray(buffer.remaining()).apply { buffer.get(this) }
val bitmap = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.size)

你有没有考虑过CameraX?它可以简化拍摄过程,并且可以处理很多问题。https://developer.android.com/training/camerax/take-photo
下面是一些你可以尝试的东西的快速概述:

class CameraActivity : AppCompatActivity() {
    ...

    val cameraController = LifecycleCameraController(this)
    cameraController.bindToLifecycle(this as LifecycleOwner)

    // Attach the CameraController to PreviewView
    val previewView = findViewById(R.id.preview_view)
    previewView.setController(cameraController)

    // Take a picture
    cameraController.takePicture(
        ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageCapturedCallback {
            override fun onCaptureSuccess(image: ImageProxy) {
                val buffer = image.planes[0].buffer
                val jpegData = ByteArray(buffer.remaining()).apply { buffer.get(this) }
                val bitmap BitmapFactory.decodeByteArray(jpegData, 0, jpegData.size)
                // show bitmap
            }

            override fun onError(exception: ImageCaptureException) {
                Log.e(TAG, "Error: $exception")
            }
    })  
}

相关问题