我是靠谱客的博主 敏感大山,最近开发中收集的这篇文章主要介绍Android-Camera-拍照流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

转载:
hal流程 :https://www.jianshu.com/p/9a2e66916fcb
拍照流程:https://blog.csdn.net/zhangbijun1230/article/details/80555769
预览:https://www.jianshu.com/p/0ea5e201260f

一、ap端拍照流程
在这里插入图片描述
首先需要了解camera2的几个比较重要的类:

  • CameraManager: 管理手机上的所有摄像头设备,它的作用主要是获取摄像头列表和打开指定的摄像头;
  • CameraDevice: 具体的摄像头设备,它有一系列参数(预览尺寸、拍照尺寸等),可以通过CameraManager的 getCameraCharacteristics()方法获取。它的作用主要是创建CameraCaptureSession和CaptureRequest;
  • CameraCaptureSession: 相机捕获会话,用于处理拍照和预览的工作(很重要);
  • CaptureRequest: 捕获请求,定义输出缓冲区以及显示界面(TextureView或SurfaceView)等;

一)、打开相机

  用CameraManager的openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)方法打开指定摄像头。该方法的第一个参数代表要打开的摄像头ID;第二个参数用于监听摄像头的状态;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。
二)、创建预览会话

1、当摄像头被打开之后会回调接口mStateCallback.onOpened,程序即可获取CameraDevice —— 即根据摄像头ID获取了指定摄像头设备,然后调用CameraDevice的createCaptureSession(List outputs, CameraCaptureSession. StateCallback callback,Handler handler)方法来创建CameraCaptureSession。该方法的第一个参数是一个List集合,封装了所有需要从该摄像头获取图片的Surface,第二个参数用于监听CameraCaptureSession的创建过程;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。
2、不管预览还是拍照,程序都调用CameraDevice的createCaptureRequest(int templateType)方法创建CaptureRequest.Builder,该方法支持TEMPLATE_PREVIEW(预览)、TEMPLATE_RECORD(拍摄视频)、TEMPLATE_STILL_CAPTURE(拍照)等参数。
3、通过以上步骤所调用方法返回的CaptureRequest.Builder设置拍照的各种参数,比如对焦模式、曝光模式等。
4、调用CaptureRequest.Builder的build()方法即可得到CaptureRequest对象,接下来程序可通过CameraCaptureSession的setRepeatingRequest()方法开始预览,或调用capture()方法拍照。
注:相机的预览与拍照流程我们了解了。
五)、拍照、保存

1、通过createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE) 创建一个拍照请求的Builder对象
2、然后设置各种参数。注意,captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, mCameraSensorOrientation)用来设置保存照片的旋转方向。如果不设置的话,保存的照片不是"自然方向"
3、拍照的结果是在 OnImageAvailableListener 对象中得到的。首先通过 CacquireNextImage() 方法获取到一个Image对象,然后通过 image.planes[0].buffer 得到 byteBuffer,将这个 byteBuffer 转换成 byteArray 。这个 byteArray 就是拍照所得到的图像数据。然后就可以把这个 byteArray 保存成图片到手机存储中
六)、 释放相机及线程

1、变量mCameraCaptureSession、mCameraDevice、mImageReader的close操作和“=null”;
2、handlerThread.quitSafely();

二、hal端拍照流程
在这里插入图片描述
整个拍摄流程如下:

1、创建一个用于从 Pipeline 获取图片的 CaptureRequest。
2、修改 CaptureRequest 的闪光灯配置,让闪光灯在拍照过程中亮起来。
3、创建两个不同尺寸的 Surface 用于接收图片数据,并且将它们添加到 CaptureRequest 中。
4、发送配置好的 CaptureRequest 到 Pipeline 中等待它返回拍照结果。
5、一个新的 CaptureRequest 会被放入一个被称作 Pending Request Queue 的队列中等待被执行,
6、当 In-Flight Capture Queue 队列空闲的时候就会从 Pending Request Queue 获取若干个待处理的 CaptureRequest,
7、并且根据每一个 CaptureRequest 的配置进行 Capture 操作。
8、最后我们从不同尺寸的 Surface 中获取图片数据并且还会得到一个包含了很多与本次拍照相关的信息的 CaptureResult,流程结束。
注:假设我们想要同时拍摄两张不同尺寸的图片,并且在拍摄的过程中闪光灯必须亮起来。

最后

以上就是敏感大山为你收集整理的Android-Camera-拍照流程的全部内容,希望文章能够帮你解决Android-Camera-拍照流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部