На этой странице описано, как снимать высококачественные изображения с помощью 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)
Ява
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.
}
})
}
Ява
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 см. в руководстве по настройке оптимизации, флэш-памяти и формата файлов .
Дополнительные ресурсы
Чтобы узнать больше о CameraX, обратитесь к следующим ресурсам: