[ 2022-08-14 🦭 TIL ]

Burkey·2022년 8월 14일
0

TIL

목록 보기
12/157

오늘은 카메라를 카메라기능과 앨범에서 사진을 가져오는 기능에 대하여 알아보았습니다.

import UIKit
import MobileCoreServices

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate{
    
    let imagePicker : UIImagePickerController! = UIImagePickerController()
    var captureImage : UIImage!
    var videoURL: URL!
    var flagImageSave = false
    var numImage = 0
    
    @IBOutlet var imageView3: UIImageView!
    @IBOutlet var ImageView2: UIImageView!
    @IBOutlet var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    @IBAction func btnCaptureImageFromCarnera(_ sender: UIButton) {
        if(UIImagePickerController.isSourceTypeAvailable(.camera)){
            flagImageSave = true
            
            numImage = numImage + 1
            
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.mediaTypes = ["public.image"]
            imagePicker.allowsEditing = false
            
            present(imagePicker, animated: true, completion: nil)
        }else{
            myAlert("Camera inaccessable", message: "application cannot access the camera")
        }
    }
    @IBAction func btnLoadImageFromLibary(_ sender: UIButton) {
        if(UIImagePickerController.isSourceTypeAvailable(.photoLibrary)){
            flagImageSave = false
            
            numImage = numImage + 1
            
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.mediaTypes = ["public.image"]
            imagePicker.allowsEditing = true
            
            present(imagePicker, animated:true)
        }else{
            myAlert("photo album inaccessable", message: "application cannot access the photo album")
        }
    }
    
    @IBAction func btnRecoardVideoFromCarmera(_ sender: UIButton) {
        if(UIImagePickerController.isSourceTypeAvailable(.camera)){
            flagImageSave = true
            
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.mediaTypes = ["public.movie"]
            imagePicker.allowsEditing = false
            
            present(imagePicker, animated: true, completion: nil)
        }else{
            myAlert("Camera inaccessable", message: "application cannot access the camera")
        }
        
    }
    
    @IBAction func btnLoadVideoFromLibary(_ sender: UIButton) {
        if(UIImagePickerController.isSourceTypeAvailable(.photoLibrary)){
            flagImageSave = false
            
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.mediaTypes = ["public.movie"]
            imagePicker.allowsEditing = false
            
            present(imagePicker, animated:true)
        }else{
            myAlert("photo album inaccessable", message: "application cannot access the photo album")
        }
    }
    
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        numImage = numImage - 1
        self.dismiss(animated: true, completion: nil)
    }
    
    @IBAction func btnEmpty(_ sender: Any) {
        imageView3.image = nil
        ImageView2.image = nil
        imageView.image = nil
    }
    
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let mediaType = info[UIImagePickerController.InfoKey.mediaType] as! NSString
        
        if mediaType.isEqual(to: "public.image" as String){
            captureImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
            
            if flagImageSave {
                UIImageWriteToSavedPhotosAlbum(captureImage, self, nil, nil)
            }
            
            if numImage == 0{
                imageView.image = captureImage
            }else if numImage == 1 {
                ImageView2.image = captureImage
            }else{
                imageView3.image = captureImage
            }
        }else {
            if flagImageSave {
                videoURL = (info[UIImagePickerController.InfoKey.mediaURL] as! URL)
            }
            UISaveVideoAtPathToSavedPhotosAlbum(videoURL.relativePath, self, nil, nil)
        }
    }
    
    func myAlert(_ title : String, message : String){
        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert)
        let action  = UIAlertAction(title: "ok", style: UIAlertAction.Style.default, handler: nil)
        
        alert.addAction(action)
        self.present(alert, animated: true, completion: nil)
    }
}

MobileCoreServices는 미디어를 불러오는데 필요한 타입들을 명시해놓은 헤더 파일입니다.
미디어를 불러와 화면에 보여지기 위해서 필요합니다.
(위에는 현재 미디어를 불러오는 기능이 없어서 없어도 무관..)

또한 카메라를 사용하여 사진을 촬영하고 저장하기에 사용자에 카메라와 파일에 접근할 수 있도록 권한을 확인해야합니다.

UIImagePickerController.isSourceTypeAvailable(.camera) //카메라 권한 확인
UIImagePickerController.isSourceTypeAvailable(.photoLibrary) //앨범 접근 권한 확인
profile
스탯 올리는 중

0개의 댓글