iOS/Swift 어플 따라하기

[Swift] Camera App 4(Photo Capture Delegate, 저장)

Chafle 2022. 4. 27. 16:40
반응형

오늘은

사진을 찍는 과정과, 저장하는 과정을 그림으로 보고 코드로 구현해 보는 시간을 가질 겁니다.

 

 

사진을 찍어서 저장하는 순서를 한번 그림으로 보면, 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("-->권한을 받지 못했습니다.")

            }

        }

    }

 

 

반응형