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