이미지 캡처

이미지 캡처 사용 사례는 고해상도 고화질 사진을 캡처할 수 있도록 설계되었으며 자동 화이트 밸런스, 자동 노출, 자동 초점(3A) 기능과 함께 간단한 수동 카메라 컨트롤을 제공합니다. 호출자는 다음 옵션을 포함하여 캡처한 사진을 사용하는 방법을 결정해야 합니다.

ImageCapture가 실행되는 맞춤설정 가능 실행기의 유형은 콜백 실행기 및 IO 실행기 두 가지입니다.

  • 콜백 실행기는 takePicture 메서드의 매개변수입니다. 사용자 제공 OnImageCapturedCallback()을 실행하는 데 사용됩니다.
  • 호출자가 이미지를 파일 위치에 저장하도록 선택하면 실행기를 지정하여 IO를 실행할 수 있습니다. IO 실행기를 설정하려면 ImageCapture.Builder.setIoExecutor(Executor)를 호출합니다. 실행기가 없으면 CameraX가 기본적으로 작업의 내부 IO 실행기로 설정됩니다.

이미지 캡처 설정

이미지 캡처는 플래시, 연속 자동 초점, 제로 셔터 랙 등 사진 촬영을 위한 기본 컨트롤을 제공합니다.

setCaptureMode()

ImageCapture.Builder.setCaptureMode()를 사용하여 사진을 찍을 때 캡처 모드를 구성합니다.

캡처 모드는 기본적으로 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)

Java

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.
            }
        })
}

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.
            }
       }
    );
}

이미지 캡처 메서드에서는 JPEG 형식을 완벽하게 지원합니다. Media.Image 객체를 YUV_420_888 형식에서 RGB Bitmap 객체로 변환하는 방법을 보여주는 샘플 코드는 YuvToRgbConverter.kt를 참조하세요.

추가 리소스

CameraX에 관해 자세히 알아보려면 다음 추가 리소스를 참고하세요.

Codelab

  • CameraX 시작하기
  • 코드 샘플

  • CameraX 샘플 앱