Android CameraX 预览以及图片分析 YUV 转 Bitmap

码农日志 2024-06-12 ⋅ 60 阅读

在 Android 开发中,相机相关功能一直是一个重点的关注点。随着 Android Jetpack 组件的不断更新,Google 推出了最新的相机库 CameraX,大大简化了相机相关的开发流程,为开发者提供了更便捷的相机操作方式。

本文将介绍如何使用 CameraX 进行相机预览,并演示如何将相机预览中的 YUV 数据转换为 Bitmap 图片进行进一步的分析。

CameraX 简介

CameraX 是 Google 为了简化 Android 相机开发而推出的一个相机库,该库提供了一套易于使用的 API,帮助开发者处理与相机相关的常见任务,例如预览、拍照、录制等。CameraX 库使用了最新的 Camera2 API,因此能够与现有的相机设备完美兼容。

添加依赖

首先,我们需要在项目的 build.gradle 文件中添加 CameraX 相关的依赖:

dependencies {
    def camerax_version = "1.0.0-beta12"
    implementation "androidx.camera:camera-camera2:$camerax_version"
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    implementation "androidx.camera:camera-view:1.0.0-alpha26"
}

相机预览

使用 CameraX 进行相机预览非常简单。首先,在布局文件中添加一个 PreviewView

<androidx.camera.view.PreviewView
    android:id="@+id/previewView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

接下来,在 Activity 或 Fragment 中的 onCreate 方法中,初始化相机预览:

val previewView = findViewById<PreviewView>(R.id.previewView)

val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
    val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
    
    val previewConfig = PreviewConfig.Builder()
        .setTargetResolution(Size(previewView.width, previewView.height))
        .build()
    
    val preview = Preview(previewConfig)

    preview.setSurfaceProvider(previewView.surfaceProvider)

    val cameraSelector = CameraSelector.Builder()
        .requireLensFacing(CameraSelector.LENS_FACING_BACK)
        .build()
    
    cameraProvider.unbindAll()
    cameraProvider.bindToLifecycle(this, cameraSelector, preview)
}, ContextCompat.getMainExecutor(this))

上述代码中,我们首先获取了一个 ProcessCameraProvider 对象,然后创建了一个 PreviewConfig 对象用于配置预览属性。接着,我们创建了一个 Preview 对象,并使用 preview.setSurfaceProvider(previewView.surfaceProvider) 将预览和 PreviewView 关联起来。

最后,我们使用 CameraSelector 选择了后置摄像头,并通过 cameraProvider.bindToLifecycle(this, cameraSelector, preview) 将相机绑定到当前的生命周期中。

YUV 转换为 Bitmap

通过 CameraX 获取的预览数据通常是 YUV 格式的,如果我们想进一步分析这些数据,可以将其转换为 Bitmap 格式。下面是一个将 YUV 数据转换为 Bitmap 图片的示例代码:

fun yuvToBitmap(yuvData: ByteBuffer, imageWidth: Int, imageHeight: Int): Bitmap {
    val yuvImage = YuvImage(yuvData.array(), ImageFormat.NV21, imageWidth, imageHeight, null)
    
    val byteArrayOutputStream = ByteArrayOutputStream()
    yuvImage.compressToJpeg(Rect(0, 0, imageWidth, imageHeight), 100, byteArrayOutputStream)
    
    val jpegData = byteArrayOutputStream.toByteArray()
    val bitmap = BitmapFactory.decodeByteArray(jpegData, 0, jpegData.size)
    
    return bitmap
}

上述代码中,我们首先创建了一个 YuvImage 对象,然后使用 compressToJpeg 方法将 YUV 数据压缩成 JPEG 格式的字节数组。最后,我们使用 BitmapFactory.decodeByteArray 方法将字节数组转换为 Bitmap 对象。

总结

本文介绍了如何使用 CameraX 进行相机预览,并演示了如何将相机预览中的 YUV 数据转换为 Bitmap 图片。CameraX 提供了一套易于使用的 API,大大简化了相机开发过程,开发者可以更加专注于相机功能的实现。

CameraX 的更多用法还包括拍照、录制等功能,感兴趣的开发者可以深入了解官方文档并结合实际需求进行开发。

参考文档:


全部评论: 0

    我有话说: