Android Camera2 API set custom Brightness, Contrast, Gamma

前端 未结 1 898
一生所求
一生所求 2021-01-05 14:52

Since this hasn\'t clear answer, and stackoverflow hasn\'t questions / answers about Camera 2 API Gamma, I ask for solution to modify Brightness, Contrast a

相关标签:
1条回答
  • 2021-01-05 15:08

    My mistake was in changing Auto White Balance Mode(AWB) to CONTROL_AWB_MODE_OFF before modifying Brightness(B), Gamma(G) or Contrast(C).
    Do not set OFF mode for AWB, use AUTO or other from possible modes.


    get current B in percents

    public int getBrightnessValue() {
        int absBRange = maxCompensationRange - minCompensationRange;
        int value = getValue(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION);
        return 100 * (value - minCompensationRange) / absBRange;
    }
    

    set B in percents

    public void setBrightness(int value) {
        int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
        previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
        applySettings();
     }
    

    set C in percents

    //set def channels (used for contrast)
    TonemapCurve tc = previewRequestBuilder.get(CaptureRequest.TONEMAP_CURVE);
    if (tc != null) {
        channels = new float[3][];
        for (int chanel = TonemapCurve.CHANNEL_RED; chanel <= TonemapCurve.CHANNEL_BLUE; chanel++) {
            float[] array = new float[tc.getPointCount(chanel) * 2];
            tc.copyColorCurve(chanel, array, 0);
            channels[chanel] = array;
        }
    }
    


    public void setContrast(int value) {
        final int minContrast = 0;
        final int maxContrast = 1;
    
        if (channels == null || value > 100 || value < 0) {
            return;
        }
    
        float contrast = minContrast + (maxContrast - minContrast) * (value / 100f);
    
        float[][] newValues = new float[3][];
        for (int chanel = TonemapCurve.CHANNEL_RED; chanel <= TonemapCurve.CHANNEL_BLUE; chanel++) {
            float[] array = new float [channels[chanel].length];
            System.arraycopy(channels[chanel], 0, array, 0, array.length);
            for (int i = 0; i < array.length; i++) {
                array[i] *= contrast;
            }
            newValues[chanel] = array;
        }
        TonemapCurve tc = new TonemapCurve(newValues[TonemapCurve.CHANNEL_RED], newValues[TonemapCurve.CHANNEL_GREEN], newValues[TonemapCurve.CHANNEL_BLUE]);
        previewRequestBuilder.set(CaptureRequest.TONEMAP_MODE, CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE);
        previewRequestBuilder.set(CaptureRequest.TONEMAP_CURVE, tc);
        applySettings();
    }
    

    private void applySettings() {
        captureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null);
    }
    

    G is still in progress.


    Code examples above may be not 100% correct, if you have better solutions or found a bug, please let me know ;)

    0 讨论(0)
提交回复
热议问题