이미지 캡처 사용 사례는 고해상도 고화질 사진을 캡처할 수 있도록 설계되었으며 자동 화이트 밸런스, 자동 노출, 자동 초점(3A) 기능과 함께 간단한 수동 카메라 컨트롤을 제공합니다. 호출자는 다음 옵션을 포함하여 캡처한 사진을 사용하는 방법을 결정해야 합니다.
takePicture(Executor, OnImageCapturedCallback)
: 이 메서드는 캡처된 이미지의 메모리 내 버퍼를 제공합니다.takePicture(OutputFileOptions, Executor, OnImageSavedCallback)
: 이 메서드는 캡처된 이미지를 제공된 파일 위치에 저장합니다.
ImageCapture
가 실행되는 맞춤설정 가능 실행기의 유형은 콜백 실행기 및 IO 실행기 두 가지입니다.
- 콜백 실행기는
takePicture
메서드의 매개변수입니다. 사용자 제공OnImageCapturedCallback()
을 실행하는 데 사용됩니다. - 호출자가 이미지를 파일 위치에 저장하도록 선택하면 실행기를 지정하여 IO를 실행할 수 있습니다. IO 실행기를 설정하려면
ImageCapture.Builder.setIoExecutor(Executor)
를 호출합니다. 실행기가 없으면 CameraX가 기본적으로 작업의 내부 IO 실행기로 설정됩니다.
이미지 캡처 설정
이미지 캡처는 플래시, 연속 자동 초점, 제로 셔터 랙 등 사진 촬영을 위한 기본 컨트롤을 제공합니다.
setCaptureMode()
ImageCapture.Builder.setCaptureMode()
를 사용하여 사진을 찍을 때 캡처 모드를 구성합니다.
CAPTURE_MODE_MINIMIZE_LATENCY
: 지연 시간에 맞게 이미지 캡처를 최적화합니다.CAPTURE_MODE_MAXIMIZE_QUALITY
: 이미지 품질에 맞게 이미지 캡처를 최적화합니다.
캡처 모드는 기본적으로 CAPTURE_MODE_MINIMIZE_LATENCY
로 설정되어 있습니다.
자세한 내용은 setCaptureMode()
참조 문서를 확인하세요.
제로 셔터 랙
1.2부터 제로 셔터 랙(CAPTURE_MODE_ZERO_SHOT_LAG
)을 캡처 모드로 사용할 수 있습니다.
제로 셔터 랙을 사용 설정하면 지연 시간이 기본 캡처 모드인 CAPTURE_MODE_MINIMIZE_LATENCY
에 비해 크게 줄어 장면을 놓치지 않을 수 있습니다.
제로 셔터 랙은 가장 최근의 캡처 프레임 3개를 저장하는 링 버퍼를 사용합니다. 사용자가 캡처 버튼을 누르면 CameraX는 takePicture()
를 호출하고 링 버퍼는 버튼 누르기의 타임스탬프에 가장 가까운 타임스탬프로 캡처된 프레임을 가져옵니다. 그러면 CameraX는 캡처 세션을 다시 처리하여 해당 프레임에서 이미지를 생성하고 이는 JPEG 형식으로 디스크에 저장됩니다.
기본 요건
제로 셔터 랙을 사용 설정하기 전에 isZslSupported()
를 사용하여 기기가 다음 요구사항을 충족하는지 확인하세요.
- Android 6.0 이상(API 수준 23 이상)을 타겟팅합니다.
PRIVATE
재처리를 지원합니다.
최소 요구사항을 충족하지 않는 기기의 경우 CameraX가 CAPTURE_MODE_MINIMIZE_LATENCY
로 대체됩니다.
제로 셔터 랙은 이미지 캡처 사용 사례에만 사용할 수 있습니다.
동영상 캡처 사용 사례 또는 카메라 확장 프로그램에서는 사용 설정할 수 없습니다.
마지막으로 플래시를 사용하면 지연 시간이 길어지므로 플래시가 켜져 있거나 자동 모드일 때는 제로 셔터 랙이 작동하지 않습니다.
플래시 모드 설정에 관한 자세한 내용은 setFlashMode()
를 참고하세요.
제로 셔터 랙 사용 설정
제로 셔터 랙을 사용 설정하려면 ImageCapture.Builder.setCaptureMode()
에 CAPTURE_MODE_ZERO_SHOT_LAG
를 전달합니다. 실패하면 setCaptureMode()
가 CAPTURE_MODE_MINIMIZE_LATENCY
로 대체됩니다.
setFlashMode()
기본 플래시 모드는 FLASH_MODE_OFF
입니다. 플래시 모드를 설정하려면 ImageCapture.Builder.setFlashMode()
를 사용하세요.
FLASH_MODE_ON
: 플래시가 상시 사용 설정되어 있습니다.FLASH_MODE_AUTO
: 플래시가 저조도 사진에서 자동으로 사용 설정됩니다.
사진 촬영
다음 코드 샘플에서는 사진을 찍도록 앱을 구성하는 방법을 보여줍니다.
Kotlin
val imageCapture = ImageCapture.Builder() .setTargetRotation(view.display.rotation) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview)
자바
ImageCapture imageCapture = new ImageCapture.Builder() .setTargetRotation(view.getDisplay().getRotation()) .build(); cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis, preview);
bindToLifecycle()
은 Camera
객체를 반환합니다. 확대/축소, 노출과 같은 카메라 출력을 제어하는 방법은 이 가이드에서 자세히 알아보세요.
카메라를 구성한 후에는 다음 코드가 사용자 작업에 따라 사진을 찍습니다.
Kotlin
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. } } ); }
이미지 캡처 메서드에서는 JPEG
형식을 완벽하게 지원합니다. Media.Image
객체를 YUV_420_888
형식에서 RGB Bitmap
객체로 변환하는 방법을 보여주는 샘플 코드는 YuvToRgbConverter.kt
를 참조하세요.
추가 리소스
CameraX에 관해 자세히 알아보려면 다음 추가 리소스를 참고하세요.
Codelab
코드 샘플