如何在camera2,android中手动控制iso

时间:2015-02-03 06:57:52

标签: android

我是android的新手,并试图找出新的camera2效果。我不知道如何手动控制相机预览中的iso。 任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:12)

确定您的设备是否支持手动ISO控制的一种方法是检查它是否支持MANUAL_SENSOR功能。

如果是这样,您可以通过禁用所有自动设置来关闭自动曝光:

previewBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);

或者只是禁用自动曝光,让自动对焦和自动白平衡保持运行:

previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);

一旦您禁用AE,您可以手动控制曝光时间,灵敏度(ISO)和帧持续时间):

previewBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposureTime);
previewBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, sensitivity);
previewBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, frameDuration);

可以从SENSOR_INFO_EXPOSURE_TIME_RANGESENSOR_INFO_SENSITIVITY_RANGE找到这些值的有效范围,了解曝光和灵敏度。对于帧持续时间,最大帧持续时间可以从SENSOR_INFO_MAX_DURATION找到,最小帧持续时间(最大帧速率)取决于您的会话输出配置。有关详细信息,请参阅StreamConfigurationMap.getOutputMinFrameDuration

请注意,一旦禁用AE,您必须控制所有3个参数(如果您从未设置过,则有默认值,但它们不会自动变化)。您可以在关闭AE之前从上一个CaptureResult复制最后一个好的值,然后再开始。

答案 1 :(得分:1)

您必须首先设置previewbuilder

mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL);

而不是

Range<Integer> range2 = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);
                    int max1 = range2.getUpper();//10000
                    int min1 = range2.getLower();//100
                    int iso = ((progress * (max1 - min1)) / 100 + min1);
                    mPreviewBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, iso);

progress是来自onProgressChanged(SeekBar seekBar, int progress, boolean user)覆盖方法

的seekBar的变量