android开发自动拍照,Android:Camera2开发详解(上):实现预览、拍照、保存照片等功能...

本文详细介绍了Android Camera2 API的架构、关键类和方法,以及如何使用它们来创建自定义相机应用,包括预览、拍照和保存照片等功能。通过示例代码展示了Camera2的配置和使用过程,帮助开发者理解和实现高级相机特性。
摘要由CSDN通过智能技术生成

0ea5e201260f

android.jpg

前言

在前几篇文章中介绍了如何调用系统相机拍照和使用Camera1的实现自定义相机拍照、人脸检测等功能

文章传送门:

接下来的几篇文章中,我将给大家介绍如何使用Camera2实现自定义相机以及在实现过程中遇到的问题。(实现效果及源码在文末给出)

一、Camera2架构概述

Camera2架构图:

0ea5e201260f

camera2架构.jpg

Camera2引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。

Camera2拍照流程图:

0ea5e201260f

Camera2拍照流程图.png

二、 Camera2中比较重要的类及方法

1. CameraManager

摄像头管理器,用于打开和关闭系统摄像头

getCameraIdList() :

返回当前设备中可用的相机列表

getCameraCharacteristics(String cameraId) :

根据摄像头id返回该摄像头的相关信息

openCamera(String cameraId, final CameraDevice.StateCallback callback,Handler handler):

打开指定cameraId的相机。参数callback为相机打开时的回调,参数handler为callback被调用时所在的线程

2. CameraDevice

描述系统摄像头,类似于早期的Camera

createCaptureRequest(int templateType):

创建一个新的Capture请求。参数templateType代表了请求类型,请求类型一共分为六种,分别为:

TEMPLATE_PREVIEW : 创建预览的请求

TEMPLATE_STILL_CAPTURE: 创建一个适合于静态图像捕获的请求,图像质量优先于帧速率

TEMPLATE_RECORD : 创建视频录制的请求

TEMPLATE_VIDEO_SNAPSHOT : 创建视视频录制时截屏的请求

TEMPLATE_ZERO_SHUTTER_LAG : 创建一个适用于零快门延迟的请求。在不影响预览帧率的情况下最大化图像质量

TEMPLATE_MANUAL : 创建一个基本捕获请求,这种请求中所有的自动控制都是禁用的(自动曝光,自动白平衡、自动焦点)

createCaptureSession(List outputs,CameraCaptureSession.StateCallback callback,Handler handler):

创建CaptureSession会话。第一个参数 outputs 是一个 List 数组,相机会把捕捉到的图片数据传递给该参数中的 Surface 。第二个参数 StateCallback 是创建会话的状态回调。第三个参数描述了 StateCallback 被调用时所在的线程

3. CameraCharacteristics

描述摄像头的各种特性,类似于Camera1中的CamerInfo。通过CameraManager的getCameraCharacteristics(String cameraId)方法来获取

get(Key key) :

通过制定的key获取相应的相机参数。

常用的key值有:

CameraCharacteristics.LENS_FACING :

获取摄像头方向。前置摄像头(LENS_FACING_FRONT)或 后置摄像头(LENS_FACING_BACK)

CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL:

获取当前设备支持的相机特性

CameraCharacteristics.SENSOR_ORIENTATION:

获取摄像头方向

CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP:

获取StreamConfigurationMap,它是管理摄像头支持的所有输出格式和尺寸

CameraCharacteristics.FLASH_INFO_AVAILABLE:

是否支持闪光灯

CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT:

同时检测到人脸的数量

CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES:

相机支持的人脸检测模式

4. CaptureRequest

描述了一次操作请求,拍照、预览等操作都需要先传入CaptureRequest参数,具体的参数控制也是通过CameraRequest的成员变量来设置

addTarget(Surface outputTarget):

给此次请求添加一个Surface对象作为图像的输出目标

set(Key key, T value):

设置指定的参数值。

// 自动对焦

captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)

// 闪光灯

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH)

// 根据摄像头方向对保存的照片进行旋转,使其为"自然方向"

captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, mCameraSensorOrientation)

// 人脸检测模式

captureRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_SIMPLE)

5. CameraCaptureSession

当需要拍照、预览等功能时,需要先创建该类的实例,然后通过该实例里的方法进行控制(例如:拍照 capture())

setRepeatingRequest(CaptureRequest request,

CaptureCallback listener, Handler handler):

根据传入的 CaptureRequest 对象开始一个无限循环的捕捉图像的请求。第二个参数 listener 为捕捉图像的回调,在回调中可以拿到捕捉到的图像信息

capture( CaptureRequest request,

CaptureCallback listener, Handler handler):

拍照。第二个参数为拍照的结果回调

6. CaptureResult

描述拍照完成后的结果

7. ImageReader

用于接收拍照结果和访问拍摄照片的图像数据。

得到一个ImageReader对象的方法为newInstance(int width, int height, int f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值