У меня плохое поведение при съемке фотографии на устройстве Samsung Galaxy S7.сняты снимки камеры2
Я ожидаю одновременно фокусировку и экспозицию перед съемкой, но в конце у меня есть своеобразное размытое изображение по сравнению с выходным видеоприложением на собственной видеокамере.
Проблема особенно заметна при увеличении изображений, но присутствует и при не увеличенной. Я также попытался включить стабилизацию оптического изображения, но проблема не устранена.
Ниже приведены ссылки на изображения образцов, объясняющие проблему.
Вот код:
Метод стадии захвата изображение 1:
public void capturePicture() {
CameraState state = getState();
if (state != IDLE && state != CLOSING && state != TAKE_PICTURE) {
boolean af = false;
boolean ae = false;
if (isAFEnabled()) {
af = true;
} else if (isAEEnabled()) {
ae = true;
}
if (!af && !ae) {
takePicture();
} else {
triggerFocusAndExposure(true);
}
}
return;
}
метод для запуска фокуса и экспозиции:
private void triggerFocusAndExposure(boolean picture) {
setState(WAIT_PRECAPTURE_PICTURE);
if (isAFEnabled()) {
previewBuilder.set(CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_START);
}
if (isAEEnabled()) {
previewBuilder.set(CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_START);
}
try {
cameraSession.capture(previewBuilder.build(), new SCameraCaptureSession.CaptureCallback() {
@Override public void onCaptureCompleted(SCameraCaptureSession session, SCaptureRequest request, STotalCaptureResult result) {
setState(PRECAPTURE_TRIGGERED_PICTURE);
}
}, backgroundHandler);
} catch (CameraAccessException e) {
return;
}
try {
previewBuilder.set(CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_IDLE);
previewBuilder.set(CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
cameraSession.setRepeatingRequest(previewBuilder.build(), mSessionCaptureCallback, backgroundHandler);
} catch (CameraAccessException e) {
}
}
Методы ждут фокуса и экспозиции:
private void waitPrecapture(STotalCaptureResult result, boolean picture) {
// Check if AF/AE triggered and/or finished
if ((!isAFTriggered(result) || isAfFinished(result)) && (!isAETriggered(result) || isAEFinished(result))) {
takePicture();
}
}
private boolean isAFTriggered(STotalCaptureResult result) {
Integer afMode = result.get(SCaptureResult.CONTROL_AF_MODE);
return afMode != CONTROL_AF_MODE_OFF &&
afMode != CONTROL_AF_MODE_EDOF;
}
private boolean isAfFinished(STotalCaptureResult result) {
int afState = result.get(SCaptureResult.CONTROL_AF_STATE);
return afState == CONTROL_AF_STATE_FOCUSED_LOCKED || afState == CONTROL_AF_STATE_NOT_FOCUSED_LOCKED
|| afState == CONTROL_AF_STATE_PASSIVE_FOCUSED || afState == CONTROL_AF_STATE_PASSIVE_UNFOCUSED;
}
private boolean isAETriggered(STotalCaptureResult result) {
boolean aeMode = result.get(SCaptureResult.CONTROL_AE_MODE) != SCaptureResult.CONTROL_AE_MODE_OFF;
return aeMode && cameraCharacteristics.get(SCameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
!= SCameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
}
private boolean isAEFinished(STotalCaptureResult result) {
Integer aeState = result.get(SCaptureResult.CONTROL_AE_STATE);
return aeState == null || aeState == SCaptureResult.CONTROL_AE_STATE_CONVERGED || aeState == SCaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED
|| aeState == SCaptureResult.CONTROL_AE_STATE_LOCKED;
}
Метод стадии захвата фото 2:
public void takePicture(){
imageReader.setOnImageAvailableListener(reader -> {
Image image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
image.close();
singleSubscriber.onSuccess(bytes);
}, imageSavingHandler);
try {
cameraSession.capture(captureBuilder.build(), new SCameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(SCameraCaptureSession session, SCaptureRequest request, STotalCaptureResult result) {
if (getState() == CameraState.CLOSING) {
return;
}
cancelAF();
}
@Override
public void onCaptureStarted(SCameraCaptureSession session, SCaptureRequest request, long timestamp, long frameNumber) {
super.onCaptureStarted(session, request, timestamp, frameNumber);
shutterCallback.call();
}
@Override public void onCaptureFailed(SCameraCaptureSession session, SCaptureRequest request, SCaptureFailure failure) {
singleSubscriber.onError(new RuntimeException("Error taking picture, onCaptureFailed"));
if (getState() == CameraState.CLOSING) {
return;
}
cancelAF();
}
}, backgroundHandler);
setState(CameraState.TAKE_PICTURE);
} catch (CameraAccessException e) {
singleSubscriber.onError(new RuntimeException("Error capturing image", e));
}
}
еще код пожалуйста – Vyacheslav
Очень интересно. 'Thanks'. Для чего? Это сайт программирования. Я мало программирую. – greenapps
Какой учебник вы использовали для захвата изображения? – abbath