本页介绍了如何使用 CameraX 拍摄高质量的照片。您可以使用 ImageCapture 类及其关联方法来执行此操作。
主要概念
以下是本文档中讨论的主要概念:
- 存储方法:您可以将图片捕获到内存缓冲区,也可以直接捕获到文件中。
- 执行器:
ImageCapture使用执行器来处理回调和 I/O 操作。您可以自定义这些执行器,以获得更好的性能和控制。 - 拍摄模式:您可以配置拍摄模式,以优化延迟时间或图片质量。
存储方法
您可以通过以下两种方式使用 ImageCapture 捕获图片。它们各自使用 ImageCapture.takePicture() 的重载:
文件:使用
takePicture(OutputFileOptions, Executor, OnImageSavedCallback)将拍摄的图片直接保存到磁盘上的文件中。- 这是最常见的拍照方式。
内存中:使用
takePicture(Executor, OnImageCapturedCallback)接收所拍摄图像的内存中缓冲区。- 这对于实时图像处理或分析非常有用。
执行器
调用 takePicture 时,您需要传递 Executor 和 OnImageCapturedCallback 或 OnImageSavedCallback 函数。Executor 运行回调并处理任何生成的 IO。
拍照
如需拍摄照片,您需要设置相机,然后调用 takePicture。
设置摄像头
如需设置相机,请创建 CameraProvider。然后,创建一个 ImageCapture 对象。使用 ImageCapture.Builder():
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)
拍照
配置相机后,调用 takePicture() 以拍摄照片。
此示例演示了如何使用 takePicture() 将图片保存到磁盘:
fun onClick() { val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File("photo.jpg")).build() imageCapture.takePicture( outputFileOptions, cameraExecutor, object : ImageCapture.OnImageSavedCallback { override fun onError(error: ImageCaptureException) { // Insert your code here } override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) { // Insert your code here } } ) }
以下是有关此代码段的要点:
- 借助
ImageCapture.OutputFileOptions,您可以配置保存位置和元数据。- 在此示例中,
OutputFileOptions.Builder()使用File对象来确定保存位置。
- 在此示例中,
takePicture()函数使用提供的选项和执行器异步捕获图像。OnImageSavedCallback提供成功和失败的回调。onImageSaved()回调可处理成功的图片拍摄,并提供对已保存图片结果的访问权限。onError()回调处理图片拍摄错误。
其他选项
如需了解有关配置 ImageCapture 的其他方法,请参阅配置优化、闪存和文件格式指南。
更多资源
如需详细了解 CameraX,请参阅以下资源:
Codelab
代码示例