美文网首页音视频音视频开发
Android CameraX 详解三 (拍照)

Android CameraX 详解三 (拍照)

作者: Kael_Zhang的安卓笔记 | 来源:发表于2022-08-24 09:12 被阅读0次

机票直达

Android CameraX 详解一 (引言&基础)
Android CameraX 详解二 (实时预览)
Android CameraX 详解三 (拍照)
Android CameraX 详解四 (图片分析)
Android CameraX 详解五(视频拍摄录制)

概述

拍照使用 ImageCapture 对象

图片拍摄用例旨在拍摄高分辨率的优质照片,不仅提供简单的相机手动控制功能,还提供自动白平衡、自动曝光和自动对焦 (3A) 功能。调用方负责决定如何使用拍摄的照片,具体包括以下选项:

  • takePicture(Executor, OnImageCapturedCallback):此方法为拍摄的图片提供内存缓冲区。
  • takePicture(OutputFileOptions, Executor, OnImageSavedCallback):此方法将拍摄的图片保存到提供的文件位置。

运行 ImageCapture 的可自定义执行程序有两种类型:回调执行程序和 IO 执行程序

  • 回调执行程序是 takePicture 方法的参数。它用于执行用户提供的 OnImageCapturedCallback()
  • 如果调用方选择将图片保存到文件位置,您可以指定执行程序以执行 IO。如需设置 IO 执行程序,请调用 ImageCapture.Builder.setIoExecutor(Executor)。如果执行程序不存在,则默认 CameraX 为任务的内部 IO 执行程序。

拍照步骤

  • 申请CAMERA权限
  • PreviewView 添加到布局
<FrameLayout
    android:id="@+id/container">
        <androidx.camera.view.PreviewView
            android:id="@+id/previewView" />
</FrameLayout>
  • 创建ProcessCameraProvider
import androidx.camera.lifecycle.ProcessCameraProvider
import com.google.common.util.concurrent.ListenableFuture

class MainActivity : AppCompatActivity() {
    private lateinit var cameraProviderFuture : ListenableFuture<ProcessCameraProvider>
    override fun onCreate(savedInstanceState: Bundle?) {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)
        cameraProviderFuture.addListener(Runnable {
            val cameraProvider = cameraProviderFuture.get()
            bindPreview(cameraProvider)
        }, ContextCompat.getMainExecutor(this))
    }
}
  • 创建 ImageCapture 拍照
fun bindPreview(cameraProvider : ProcessCameraProvider) {
    val preview = Preview.Builder().build()
    val cameraSelector = CameraSelector.Builder()
          .requireLensFacing(CameraSelector.LENS_FACING_BACK)
          .build()
    val imageAnalyzer = ImageAnalysis.Builder().build()
    preview.setSurfaceProvider(previewView.getSurfaceProvider())
    imageCapture = ImageCapture.Builder().build()
    cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview)
}

// 拍照
val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File(...)).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.
        }
})

相关文章

网友评论

    本文标题:Android CameraX 详解三 (拍照)

    本文链接:https://www.haomeiwen.com/subject/xiaygrtx.html