Android 专业模式下的曝光补偿实现算法

曝光:打开摄像头小孔,光线从小孔进入射入到对面墙壁的胶卷上,产生了光化反应,照片就诞生了,此过程就叫做曝光

曝光补偿,简单说就是暗环境增加进光量提高图片亮度,亮环境减少进光量降低图片亮度。

Camera2中获取曝光补偿的Key及步长Key
CONTROL_AE_COMPENSATION_RANGE
CONTROL_AE_COMPENSATION_STEP

CONTROL_AE_COMPENSATION_RANGE 获取当前支持的曝光补偿支持的范围

        Range 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 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();
                }

你可能感兴趣的:(Android 专业模式下的曝光补偿实现算法)