На этой странице описано, как получать высококачественные изображения с помощью CameraX. Для этого используется класс ImageCapture и связанные с ним методы.
Ключевые понятия
В данном документе рассматриваются следующие основные понятия:
- Способ хранения : Вы можете сохранять изображения либо в буфер в оперативной памяти, либо непосредственно в файл.
- Исполнительные модули :
ImageCaptureиспользует исполнительные модули для обработки обратных вызовов и операций ввода-вывода. Вы можете настроить эти исполнительные модули для повышения производительности и контроля. - Режимы захвата : Вы можете настроить режим захвата для оптимизации либо задержки, либо качества изображения.
Способ хранения
Существует два способа захвата изображений с помощью ImageCapture . Оба используют перегрузку метода ImageCapture.takePicture() :
Файл: Используйте
takePicture(OutputFileOptions, Executor, OnImageSavedCallback), чтобы сохранить захваченное изображение непосредственно в файл на диске.- Это самый распространённый способ делать фотографии.
В памяти: Используйте
takePicture(Executor, OnImageCapturedCallback), чтобы получить буфер захваченного изображения в памяти.- Это полезно для обработки или анализа изображений в реальном времени.
Исполнители завещаний
При вызове takePicture вы передаете объект Executor и либо функцию OnImageCapturedCallback , либо OnImageSavedCallback . Executor выполняет функцию обратного вызова и обрабатывает все последующие операции ввода-вывода.
Сфотографируйте
Чтобы сделать снимок, нужно настроить камеру, а затем вызвать takePicture .
Настройте камеру
Для настройки камеры создайте CameraProvider . Затем создайте объект ImageCapture . Используйте ImageCapture.Builder() :
Котлин
val imageCapture = ImageCapture.Builder()
.setTargetRotation(view.display.rotation)
.build()
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview)
Java
ImageCapture imageCapture =
new ImageCapture.Builder()
.setTargetRotation(view.getDisplay().getRotation())
.build();
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, preview);
Сфотографируйте
После настройки камеры вызовите takePicture() для захвата изображения. В этом примере показано, как использовать takePicture() для сохранения изображения на диск:
Котлин
fun onClick() {
val outputFileOptions = ImageCapture.OutputFileOptions.Builder(File(...)).build()
imageCapture.takePicture(outputFileOptions, cameraExecutor,
object : ImageCapture.OnImageSavedCallback {
override fun onError(error: ImageCaptureException)
{
// insert your code here.
}
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
// insert your code here.
}
})
}
Java
public void onClick() {
ImageCapture.OutputFileOptions outputFileOptions =
new ImageCapture.OutputFileOptions.Builder(new File(...)).build();
imageCapture.takePicture(outputFileOptions, cameraExecutor,
new ImageCapture.OnImageSavedCallback() {
@Override
public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
// insert your code here.
}
@Override
public void onError(ImageCaptureException error) {
// insert your code here.
}
}
);
}
Вот основные моменты, касающиеся этого фрагмента:
- Параметр
ImageCapture.OutputFileOptionsпозволяет настроить место сохранения и метаданные.- Здесь метод
OutputFileOptions.Builder()использует объектFileдля определения места сохранения.
- Здесь метод
- Функция
takePicture()асинхронно захватывает изображение, используя предоставленные параметры и исполнитель. - Функция
OnImageSavedCallbackпредоставляет обработчики событий при успешном и неудачном выполнении операции.- Функция обратного вызова
onImageSaved()обрабатывает успешный захват изображения и предоставляет доступ к сохраненным результатам . - Функция обратного вызова
onError()обрабатывает ошибки захвата изображения.
- Функция обратного вызова
Дополнительные опции
Дополнительные способы настройки ImageCapture описаны в руководстве по настройке оптимизации, Flash и форматов файлов .
Дополнительные ресурсы
Чтобы узнать больше о CameraX, обратитесь к следующим ресурсам: