由于 this 没有明确答案,而且stackoverflow没有关于Camera 2 API Gamma的问题/答案,我要求解决方案修改亮度,对比度和Gamma使用Android Camera 2 API。
我的代码是 range 和 step :
Rational controlAECompensationStep = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP);
if (controlAECompensationStep != null) {
compensationStep = controlAECompensationStep.doubleValue();
}
Range<Integer> controlAECompensationRange = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE);
if (controlAECompensationRange != null) {
minCompensationRange = controlAECompensationRange.getLower();
maxCompensationRange = controlAECompensationRange.getUpper();
}
我设置百分比亮度的方法:
public void setBrightness(int value) {
int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
applySettings();
}
private void applySettings() {
try {
captureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
我描述了我在 documentation (包括演示.apk)中找到的所有内容。
答案 0 :(得分:4)
我的错误是在修改亮度(B),Gamma(G)或对比度(C)之前将Auto White Balance Mode(AWB)更改为CONTROL_AWB_MODE_OFF。
请勿为OFF
设置AWB
模式,使用AUTO
或其他可能的模式。
获得当前百分比
public int getBrightnessValue() {
int absBRange = maxCompensationRange - minCompensationRange;
int value = getValue(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION);
return 100 * (value - minCompensationRange) / absBRange;
}
将百分比设为B
public void setBrightness(int value) {
int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
applySettings();
}
将C设置为百分比
//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 仍在进行中。
以上代码示例可能不是100%正确,如果您有更好的解决方案或发现错误,请告诉我;)