曝光:打开摄像头小孔,光线从小孔进入射入到对面墙壁的胶卷上,产生了光化反应,照片就诞生了,此过程就叫做曝光
曝光补偿,简单说就是暗环境增加进光量提高图片亮度,亮环境减少进光量降低图片亮度。
Camera2中获取曝光补偿的Key及步长Key
CONTROL_AE_COMPENSATION_RANGE
CONTROL_AE_COMPENSATION_STEP
CONTROL_AE_COMPENSATION_RANGE
获取当前支持的曝光补偿支持的范围
Range<Integer> range = mCharacteristics.get(cameraId).get(CameraCharacteristics
.CONTROL_AE_COMPENSATION_RANGE);
int max = range.getUpper();
int min = range.getLower();
CONTROL_AE_COMPENSATION_STEP
获取曝光补偿步长,即曝光补偿间隔系数。
Rational rational = mCharacteristics.get(cameraId).get(CameraCharacteristics
.CONTROL_AE_COMPENSATION_STEP);
double step = rational.doubleValue();
根据曝光补偿值和步长换算得到一组曝光值算法
//--获取支持的曝光补偿范围
Range<Integer> range = characteristics.get(CameraCharacteristics
.CONTROL_AE_COMPENSATION_RANGE);
int max = range.getUpper();
int min = range.getLower();
//--获取曝光补偿步长系数
Rational rational = characteristics.get(CameraCharacteristics
.CONTROL_AE_COMPENSATION_STEP);
double step = rational.doubleValue();
//--根据曝光的最大值和最小值,计算每次增加的步长
int increment = 1;
while ((max - min) / increment > 10) {
increment++;
}
//--换算曝光补偿支持的最小值
int start = min;
if (start < 0) {
while (Math.abs(start) % increment != 0) {
start++;
}
}
//--步长总数
int size = 0;
for (int i = start; i <= max; i += increment) size++;
//--记录UI显示的曝光值
CharSequence entries[] = new CharSequence[size];
//--记录根据步长得到的真实曝光值
CharSequence entryValues[] = new CharSequence[size];
int count = 0;
for (int i = start; i <= max; i += increment, count++) {
//--这里存储的是真实下发Camera的曝光值
entryValues[count] = Integer.toString(i);
StringBuilder builder = new StringBuilder();
//--如果是大于正数,则在前面添加+号
if (i > 0) builder.append('+');
//--保留两位有效数字
DecimalFormat format = new DecimalFormat("#.##");
//--这里仅仅是UI显示用到的曝光值
entries[count] = builder.append(format.format(i * step)).toString();
}