오늘은
사진을 찍는 과정과, 저장하는 과정을 그림으로 보고 코드로 구현해 보는 시간을 가질 겁니다.
사진을 찍어서 저장하는 순서를 한번 그림으로 보면, CapturePhotoWithSettings: delegate가 있고
그 하위로 여러가지 작업들을 수행하는데
오늘은 중간과정은 생략하고 didFinishProcessingPhoto로 사진을 찍어 저장하는 작업만 구현해 보도록 합니다.
capturePhotoWithSettings: delegate구현
@IBAction func capturePhoto(_ sender: UIButton) {
let videoPreviewLayerOrientation = self.previewView.videoPreviewLayer.connection?.videoOrientation
//현재 캡쳐세션의 오리엔테이션 가져오기 (포토 아웃풋으로 들어온 데이터에 대한 오리엔테이션을 구해서 설정해줍니다.
//가로,세로 위아래 반전,상황에서 previewViedeoLayer가 가진 오리엔테이션을 현재 사진에도 적용한다)
sessionQueue.async {
let connection = self.photoOutput.connection(with: .video)
connection?.videoOrientation = videoPreviewLayerOrientation!
// 캡쳐 포토 버튼 눌렀을 때 캡쳐세션에서 사진찍기를 요청합니다.
let setting = AVCapturePhotoSettings()
self.photoOutput.capturePhoto(with: setting, delegate: self)
//델리게이트 self로 해주면 중간중간 단계별로 후처리 가능합니다
}
}
didFinishProcessingPhoto 구현하기
extension CameraViewController: AVCapturePhotoCaptureDelegate {
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
//didFinishProcessingPhoto에서 데이터가 내려옵니다.
guard error == nil else { return }
guard let imageData = photo.fileDataRepresentation() else { return }
guard let image = UIImage(data: imageData) else { return }
self.savePhotoLibrary(image: image)
//가져온 데이터를 저장합니다.
photoLibrary에 저장
저장하기 전에 사용자의 허락을 받아야 합니다.
func savePhotoLibrary(image: UIImage) {
//허락받기
PHPhotoLibrary.requestAuthorization { status in
if status == .authorized {
//저장하기
PHPhotoLibrary.shared().performChanges ({
PHAssetChangeRequest.creationRequestForAsset(from: image)
}) { (success, error) in
print("-->이미지 저장 완료 했니? \(success)")
}
} else {
//재요청
print("-->권한을 받지 못했습니다.")
}
}
}
'iOS > Swift 어플 따라하기' 카테고리의 다른 글
[Swift] Progress Bar 진행상황 처리 (0) | 2022.06.14 |
---|---|
[Swift] How to Play a Sound (0) | 2022.06.02 |
[Swift] Camera App 3(내부,외부 카메라 toggle button) (6) | 2022.04.14 |
[Swift] Camera App 2(captureSession 구성) (0) | 2022.04.12 |
[Swift] Camera App 1(captureSession설정) (0) | 2022.04.08 |