Android Camera2拍照时照片拍出来特别暗

最近在开发相机的过程中遇到这样一个问题,相机打开闪光灯后拍照后照片特别的暗,刚开始打算修改一些拍照时的参数,提高曝光率啊,延长曝光时长来改善照片问题

如一下思路

1.通过设置曝光时间范围(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE),增加感光元件的曝光时间,接收到更多的光线,使得弱光场景下拍的更亮。

/设置预览请求的方式
previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
 
...
 
//自动对焦
previewBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
//设置自动曝光帧率范围
previewBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange());
 //对焦触发器设置为空闲状态
previewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
captureSession.setRepeatingRequest(previewBuilder.build(),captureCallback, mainHandler);
 
 private Range<Integer> getRange() {
        CameraManager mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        CameraCharacteristics chars = null;
        try {
            chars = mCameraManager.getCameraCharacteristics(cameraID);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
        Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
 
        Range<Integer> result = null;
 
        for (Range<Integer> range : ranges) {
            //帧率不能太低,大于10
            if (range.getLower()<10)
                continue;
            if (result==null)
                result = range;
            //FPS下限小于15,弱光时能保证足够曝光时间,提高亮度。range范围跨度越大越好,光源足够时FPS较高,预览更流畅,光源不够时FPS较低,亮度更好。
            else if (range.getLower()<=15 && (range.getUpper()-range.getLower())>(result.getUpper()-result.getLower()))
                result = range;
        }
        return result;
    }
实际代码中我设置的自动曝光FPS范围是[10,30],理由是,FPS下限越小,曝光时间越长,那么接收到的光线越多,拍出来的场景就越亮。FPS的范围需要有一定的跨度是因为,FPS太小的时候,比如10,预览会比较卡,体验没那么好,如果范围设置成[15,15]这种,全程都很卡。跨度大一点,在光线足够的时候,FPS会升上去,就不卡了。因为拍照其实对预览的帧率要求没有录像高,因此牺牲一些帧率大大的提高感光度是可以接受的。关于录像使用这种方式会比较卡顿的问题,后面会讲另一个办法。

这里我的代码中没有用到CONTROL_AE_LOCK,有些人可能设置了预览拍照的时候锁定曝光,或者手动调曝光模式,需要注意了。这个方法是不会起作用,因为他是设置在自动曝光模式下的FPS范围,你可能需要设置曝光模式在非锁定状态下或自动曝光模式下,才能起作用。

最后,如果预览的时候亮度正常了,拍照时还是比较暗,需要在拍照的CaptureRequest.Builder也进行这样的设置。

2.设置预览请求方式为CameraDevice.TEMPLATE_RECORD,优先保证稳定的帧率,牺牲画面的质量。

previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
设置这种预览请求方式后,即使不设置曝光的FPS范围,也能在弱光环境下看到比较亮的场景,但是,明显的感觉到,噪点变多了,画面没那么清晰了,可以做个切换,对比一下画质。这时也可以去设置曝光FPS的范围,但是作用不大,甚至让本来流畅的预览变得更卡。

最终我的处理是,拍照的时候,预览方式是CameraDevice.TEMPLATE_PREVIEW,画质更清晰,弱光时帧率稍低一点,光线足够时帧率比较流畅。预览和拍出来的照片亮度都很好。录制视频时,预览方式是CameraDevice.TEMPLATE_RECORD,画质稍差,无需设置曝光FPS范围。帧率能够全程保持流畅,弱光环境下视频效果也比较亮。

后来发现在拍照过程中闪光灯是关闭状态,于是在拍照过程中也要打开闪光灯

  1. builder.set(CaptureRequest.CONTROL_AE_MODE,

  2. CaptureRequest.CONTROL_AE_MODE_ON);

  3. builder.set(CaptureRequest.FLASH_MODE,

  4.           CaptureRequest.FLASH_MODE_TORCH);

这个可以有效改善Camera2 拍照照片变暗的问题


 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值