Camera2相机拍照流程之拍照功能梳理

/**
 * 拍照时调用方法
 */
private void captureStillPicture() {
    try {
        if (mCameraDevice == null) {
            return;
        }
        // 创建作为拍照的CaptureRequest.Builder
        mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
        // 将imageReader的surface作为CaptureRequest.Builder的目标
        mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
		/*  // 设置自动对焦模式
        mBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
        // 设置自动曝光模式
        mBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);*/
        //设置为自动模式
		//mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);

        setFlashMode(CONTROL_AE_MODE);
        // 停止连续取景
        mCaptureSession.stopRepeating();
        // 捕获静态图像
        mCaptureSession.capture(mPreviewRequestBuilder.build(), new CameraCaptureSession.CaptureCallback() {
            // 拍照完成时激发该方法
            @Override
            public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                //重新打开预览
                createCameraPreview();
            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

拍照流程如下:

1、通过cameraDevice对象创建拍照请求构建器对象mPreviewRequestBuilder。传入的CameraDevice.TEMPLATE_STILL_CAPTURE代表当前发送的请求是要准备拍照了。

// 创建作为拍照的CaptureRequest.Builder
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);

2、通过mPreviewRequestBuilder设置照片数据输出到目标位置,即Surface。注意这个Surface在创建ImageReader对象的构造器时自动生成了;

mSurface = nativeGetSurface();

3、通过captueSession调用capture()函数发送一次捕获请求,这里也需要传入捕获状态回调对象,当拍照完成后会回调到onCaptureCompleted()函数,在这个函数中重新开启预览;

mCaptureSession.capture(mPreviewRequestBuilder.build(), new CameraCaptureSession.CaptureCallback()...)

4、捕获到的image数据读取并保存到本地图片文件中的过程其实是在mageReader.OnImageAvailableListener中的onImageAvailable()回调函数中完成的

/**
 * 预览请求构建器, 用来构建"预览请求"(下面定义的)通过pipeline发送到Camera device
 * 这是{@link ImageReader}的回调对象。 当静止图像准备保存时,将会调用“onImageAvailable”。
 */
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
        = new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {
        mFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg");
        mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));
    }

};

5、当完成照片的读取后,会对调到onCaptureCompleted()函数。

        只有执行capture()方法后才会回调到ImageAvailableListener的onImageAvailable函数。

onImageAvailable函数中的处理逻辑是:

1、创建一个本地文件对象;

2、通过handler对象发生一个消息到子线程中进程image数据流的读写;其中使用reader.acquireNextImage()获取到一帧图像数据。

3、具体读写操作在ImageSaver对象中,这里就是普通的文件读写了。

@Override
public void run() {
    ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
    byte[] bytes = new byte[buffer.remaining()];
    buffer.get(bytes);
    FileOutputStream output = null;
    try {
        output = new FileOutputStream(mFile);
        output.write(bytes);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        mImage.close();
        if (null != output) {
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Camera2拍照流程如下: 1. 创建CameraManager对象,获取可用的相机列表。 2. 选择一个相机,打开相机设备,创建CameraDevice对象。 3. 创建CaptureSession,设置预览Surface和拍照Surface。 4. 创建CaptureRequest.Builder,设置拍照参数。 5. 调用CaptureSession.capture()方法,开始拍照。 6. 在CaptureSession.CaptureCallback中监听拍照结果,获取拍照的图片数据。 7. 关闭相机设备,释放资源。 以上是Android Camera2拍照的基本流程,具体实现需要根据实际需求进行调整。 ### 回答2: Android camera2拍照流程是由一系列的API方法构成的,主要包括初始化相机,设置CaptureRequest和CaptureSession,以及触发拍照,捕获图像的过程。 首先需要初始化相机,可以通过CameraManager API来实现。在初始化时,需要指定所要使用的相机ID,以及设置相机状态监听器。一旦相机初始化完成,可以通过相机管理器对象获取相机的特性信息,并根据需要设置相机的参数,如预览尺寸、图片格式等。 接下来需要创建CaptureRequest对象,用于设置拍照的相关参数,如拍摄模式、闪光灯、曝光时间等。可以通过CameraDevice API创建CaptureRequest对象,并进行相关设置。 然后需要创建CaptureSession对象,用于处理相机图像的捕获和处理。可以使用CameraDevice的createCaptureSession方法创建CaptureSession,并将所有需要完成的CaptureRequest集合成一个List,然后将其作为参数传递给CaptureSession。 一旦CaptureSession成功创建,可以将CaptureRequest对象发送到CaptureSession,以便开始拍照和捕获图像。可以使用CaptureSession的capture方法来启动图像捕获,并设置捕获回调处理来处理捕获的图像。 最后,对于处理捕获的图像,可以使用ImageReader API将Image对象转换为Bitmap等图像格式,并保存到本地存储设备。可以在ImageReader注册的回调函数中处理Image对象,并将结果保存到本地存储设备。 总之,Android camera2拍照的过程中需要进行初始化相机,设置CaptureRequest和CaptureSession,以及触发拍照,捕获图像等一系列步骤。这些API方法的使用可以实现各种必要的设置和操作,从而使得Android camera2相机拍照流程更为灵活、高效和自由。 ### 回答3: Android camera2是及其完善的相机API,相比于旧版camera API,camera2的API设计更加友好。但是camera2的拍照流程相比于旧版API来说是更加复杂的。因此,本文将详细介绍Android camera2拍照流程。 1. 获取CameraManager实例 CameraManager用于枚举可用相机设备和打开指定的相机设备。 2. 获取CameraCharacteristics实例 在相机设备被打开前,需要获取相机设备的特性信息,例如: 它属于前置摄像头或后置摄像头、支持的预览尺寸、支持的拍照尺寸等。 3. 打开相机设备 使用CameraManager打开指定的相机设备,然后获取相机设备的实例。 4. 创建CaptureSession CaptureSession代表了一个相机拍摄的会话,可以定义预览和拍照的参数设置。 5. 配置CaptureRequest 在CameraDevice创建完成,并且CaptureSession已经准备好之后,开始配置CaptureRequest。CaptureRequest代表了拍照请求参数,需要在此设置各种请求参数,例如:曝光时间、ISO、自动对焦等。 6. 设置CaptureRequest 将CaptureRequest添加到CaptureSession中,开始设置请求参数和相机设备的状态。 7. 开始拍照 当上述流程都完成后,就可以触发拍照了。一般情况下,设置好CaptureRequest之后调用CaptureSession的capture方法即可拍照。 8. 获取照片数据 在照片拍摄完成后,可以通过ImageSaver保存jpg格式的照片。 总结: 相比于旧版的API,Android camera2提供了更多的接口和更强大的能力。在使用camera2时,需要依次执行上述步骤。 此外,值得注意的是,在拍摄完成后,记得要及时释放相关资源,关闭相机设备、关闭CaptureSession、关闭ImageReader等,以免引起性能和内存问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值