标签:android-camera2 android-camera android
由于this尚无明确答案,并且stackoverflow还没有关于Camera 2 API Gamma的问题/答案,因此我要求提供使用Android Camera 2 API修改Brightness,Contrast和Gamma的解决方案.
我的代码获取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();
}
}
但是这种方法无法正常工作.图像变成green,就像here.
我描述了我在documentation中发现的所有内容(包括演示.apk).
解决方法:
我的错误是在修改亮度(B),伽玛(G)或对比度(C)之前将Auto White Balance Mode(AWB)更改为CONTROL_AWB_MODE_OFF.
不要为自动白平衡设定OFF模式,使用AUTO或其他可能的模式.
获得当前B的百分比
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%正确,如果您有更好的解决方案或发现了错误,请告诉我;)
标签:android-camera2,android-camera,android 来源: https://codeday.me/bug/20191026/1934326.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。