Я пытаюсь сделать снимок с помощью Flash в условиях низкой освещенности, используя Android Camera2 API.
Проблема в том, что состояние освещения первого снимка, который я делаю, похоже, блокирует некоторые значения, и я не знаю, как ими управлять.
Если я начну с картинки при хорошем освещении, все будет работать как хочется. Если после этого я получаю снимок при слабом освещении, я получаю хороший результат.
Если я сделаю первый снимок в условиях низкой освещенности, снимок станет белым, а затем предварительный просмотр будет полностью переэкспонирован. Каждая следующая фотография, которую я делаю, тоже белая.
Я пытался установить несколько параметров CaptureRequest (LOCK_AE_MODE и т. Д.), Но я просто не знаю, какие параметры контролировать и когда.
Вот как я фотографирую:
protected void takePicture() {
if (null == cameraDevice) {
Log.e(TAG, "cameraDevice is null");
return; }
image_available=false;
try {
List<Surface> outputSurfaces = new ArrayList<Surface>(2);
outputSurfaces.add(imageReader.getSurface());
outputSurfaces.add(new Surface(textureView.getSurfaceTexture()));
final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(imageReader.getSurface());
captureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
// Orientation
int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
imageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
public void onConfigured(CameraCaptureSession session) {
try {
session.capture(captureBuilder.build(), captureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
public void onConfigureFailed(CameraCaptureSession session) {
}
}, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
А вот мой предварительный просмотр:
protected void createCameraPreview() {
try {
SurfaceTexture texture = textureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
Surface surface = new Surface(texture);
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(surface);
//captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
//captureRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, ??);
//captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
if (null == cameraDevice) {
return; }
try {
cameraCaptureSession.capture(captureRequestBuilder.build(), null, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
cameraCaptureSessions = cameraCaptureSession;
updatePreview();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Log.e(TAG, "Configuration change");
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
protected void updatePreview() {
if (null == cameraDevice) {
Log.e(TAG, "updatePreview error, return");
}
captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
try {
cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
Моя цель - всегда добиваться результата, как если бы я начинал с первого снимка при хорошем освещении.
Есть ли способ установить и заблокировать те же параметры вручную, прежде чем начать предварительный просмотр?