Я использую Camera2 API для захвата изображений в цикле.
Когда я снимаю изображение, я получаю обратный вызов в методе onCaptureCompleted и там использую TotalCaptureResult для получения информации об изображении, такой как iso, экспозиция и метка времени. Затем я храню эту информацию на карте.
После этого я получаю изображение в OnImageAvailableListener ImageReader и использую метод getTimestamp изображения и ExifInterface для получения exif-данных, таких как ISO и выдержка.
Удивительно, но значения изо и экспозиции различаются для изображения и результата захвата в одно и то же время.
Это нормально?
Ссылочный код:
mSession.capture(captureRequest.build(), new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
int capturedISO = result.get(CaptureResult.SENSOR_SENSITIVITY);
long timeStamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
/// Save somewhere to be used later
super.onCaptureCompleted(session, request, result);
}
}, backgroundHandler);
И в OnImageAvailableListener
public void onImageAvailable(ImageReader imageReader) {
if (!isRecording) {
return;
}
Image image = imageReader.acquireLatestImage();
Long timestamp = image.getTimestamp();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
outputStream.write(bytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
image.close();
try {
ExifInterface exifInterface = new ExifInterface(file.getAbsolutePath());
double value = exifInterface.getAttributeDouble(ExifInterface.TAG_ISO_SPEED_RATINGS, 0);
/// Compare the iso with the CaptureCallback's saved one for this timestamp. I got different values.
} catch (Exception e) {
e.printStackTrace();
}
}