[Camera2] Camera2로 사진 촬영(Capture)
Camera2 프리뷰띄우기 및 캡처 샘플 코드 - GitHub
GitHub - googlearchive/android-Camera2Basic: Migrated:
Migrated:. Contribute to googlearchive/android-Camera2Basic development by creating an account on GitHub.
github.com
Camera2 흐름도 - 사진 촬영(Capture)까지
Camera2 샘플코드를 작성자가 직접 해석한 흐름도임으로, 정확하지 않을 수 있다.
주요 함수 설명
CameraCaptureSession.capture(previewRequestBuilder.build(), captureCallback, backgroundHandler)
단일 캡처 요청을 수행하는데 사용되며, 지정된 CaptureRequest를 기반으로 카메라가 캡처 작업을 수행하게 된다.
예를 들어, 프리뷰를 캡처하여 이미지를 가져오는데 사용될 수 있습니다. 캡처 작업이 완료되면 captureCallback의 적절한 콜백 메서드가 호출되며, 콜백을 통해 캡처 결과를 확인하고 처리할 수 있습니다.
참고로, CameraCaptureSession은 카메라 캡처 작업을 관리하는데 사용되는 세션 객체이며, 이를 통해 여러 개의 캡처 요청을 관리하고 동시에 처리할 수 있습니다.
함수 인자 | 설명 |
previewRequestBuilder.build() (previewRequestBuilder : CaptureRequest.Builder) |
캡처할 이미지를 정의하는 CaptureRequest 객체 |
captureCallback (: CameraCaptureSession.CaptureCallback) |
캡처 작업이 완료되거나 오류가 발생했을 때 호출되는 콜백 |
backgroundHandler |
캡처 작업을 처리하는데 사용되는 스레드를 지정하는 핸들러 |
CameraCaptureSession.captureBurst(captureRequestList, captureCallback, null)
여러장 캡처 요청을 수행하는데 사용되며, 지정된 captureRequestList를 기반으로 카메라가 캡처 작업을 수행하게 된다.
예를 들어, 프리뷰를 캡처하여 이미지를 가져오는데 사용될 수 있습니다. 캡처 작업이 완료되면 captureCallback의 적절한 콜백 메서드가 호출되며, 콜백을 통해 캡처 결과를 확인하고 처리할 수 있습니다.
참고로, CameraCaptureSession은 카메라 캡처 작업을 관리하는데 사용되는 세션 객체이며, 이를 통해 여러 개의 캡처 요청을 관리하고 동시에 처리할 수 있습니다.
// Set up a list of capture requests to be captured in a burst
val captureRequestList = mutableListOf<CaptureRequest>()
for (i in 0 until BURST_SIZE) {
captureBuilder.let { captureRequestList.add(it.build()) }
}
// Capture the burst of images
captureSession.captureBurst(captureRequestList, captureCallback, null)
함수 인자 | 설명 |
captureRequestList ( : MutableList<CaptureRequest>) |
캡처할 이미지를 정의하는 CaptureRequest List 객체 |
captureCallback ( : CameraCaptureSession.CaptureCallback) |
캡처 작업이 완료되거나 오류가 발생했을 때 호출되는 콜백 |
null ( : handler) |
캡처 작업을 처리하는데 사용되는 스레드를 지정하는 핸들러 |
CameraCaptureSession.stopRepeating( )
현재 설정된 반복 캡처를 취소하는 역할로서, "setRepeatingRequest" 또는 "setRepeatingBurst"로 설정한 반복 캡처를 중지시킨다. 또한 이 이후에 추가적인 반복 캡처가 수행되지 않으며, 이전에 설정된 반복 캡처도 중지된다. 그러나 "capture" 또는 "captureBurst" 메서드를 통해 제출된 캡처 요청에는 영향을 주지 않는다. 이미 진행 중인 캡처 요청은 완료된다.
쉽게 말해, "stopRepeating()"은 현재 진행 중인 반복 캡처를 중지시키는 역할을 하며, 이후에는 새로운 반복 캡처가 시작되지 않도록 한다.
CameraCaptureSession.abortCaptures( )
모든 현재 캡처 요청과 대기 중인 캡처 요청을 취소하는 역할로서, 현재 진행 중인 모든 캡처 요청과 아직 실행되지 않은 캡처 요청이 즉시 취소된다. 이는 "setRepeatingRequest", "setRepeatingBurst", "capture" 및 "captureBurst" 메서드를 통해 제출된 모든 캡처 요청에 영향을 준다.
쉽게 말해, 이미지 캡처가 진행 중이거나 대기 중인 캡처 요청이 있을 경우, 해당 모든 요청이 취소되며 처리되지 않는다. 이미 캡처된 이미지나 중단 중인 burst 캡처는 그대로 유지된다.
이는 일시적인 예외 상황이나 특수한 경우에 사용된다.
대부분의 경우에는 캡처 요청을 일시적으로 중지시키기보다는 "stopRepeating()"을 사용하여 반복 캡처를 멈추는 것이 일반적이다. "abortCaptures()"는 특정 상황에서만 사용하고, 주의해서 사용해야 합니다.
리스너 및 콜백 함수 설명
ImageReader.OnImageAvailableListener
ImageReader 클래스에서 이미지가 사용 가능해지면 호출되는 콜백 메커니즘을 구현하는데 사용된다.
ImageReader는 카메라 또는 다른 소스에서 이미지를 캡처하는데 사용되며, 이 이미지들은 ImageReader에게 제공되어 처리됩니다.
함수 | 설명 |
onImageAvailable(ImageReader) | 이미지가 사용 가능해지면 호출되며, ImageReader에서 이미지를 가져와서 처리할 수 있게 해준다. |
CameraCaptureSession.CaptureCallback()
카메라 장치에 제출된 CaptureRequest의 진행률을 추척하기 위한 콜백 클래스이다.
CameraCaptureSession.CaptureCallback 함수 | 설명 |
onCaptureProgregressed (CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult) |
이미지 캡처가 부분적으로 앞으로 진행될 때 호출되는 함수이다. 이미지 캡처의 일부 결과 사용 가능하다. |
onCaptureCompleted (CameraCaptureSession session, CaptureRequest request, TotalCaptureResult resulf) |
이미지 캡처가 완전히 완료되고 모든 결과 메타데이터를 사용할 수 있을 때 호출되는 함수이다. |
여기까지는 override 하는 함수이며, process, capturePicture 함수를 추가로 작성하였다.
CameraCaptureSession.CaptureCallback 함수 | 설명 |
process(CaptureRequest request) | state 변수에 따른 동작이 있는 함수이다. - STATE_PREVIEW : 아무것도 안함 - STATE_WAITING_LOCK : capturePicture(...) - STATE_WAITING_PRECAPTURE : 노출 상태를 확인하고, 현재 노출이 잡히고 있는 상태라면 state 변경 - STATE_WAITING_NON_PRECAPTURE : 노출 상태를 확인하고, 현재 노출이 잡혔으면 state 변경 후 captureStillPicture() 함수 호출 |
capturePicture(CaptureRequest request) | 이미지 캡처가 가능한 초점 상태와 노출 상태를 확인한다. - 캡처 가능할 경우, captureStillPicture() 함수 호출 - 노출 상태가 제대로 되지 않아 캡처 불가능한 경우, runPrecaptureSequence() 함수 호출 |
Camera state 설명
Camera state | 설명 |
STATE_PREVIEW | 프리뷰를 띄우고 있는 상태 (아무것도 안하는 상태) |
STATE_WAITING_LOCK | 촬영을 위해 Focus 고정 시킨 상태 |
STATE_WAITING_PRECAPTURE | 촬영을 위해 PreCapture 대기 상태 |
STATE_WAITING_NON_PRECAPTURE | 촬영을 위한 PreCapture 설정까지 완료한 상태 |
STATE_PICTURE_TAKEN | 이제 Picture 할 상태 |