Search code examples
swift3ios10

Take a photo and save to photo library in Swift


I have a button "take a photo" and when pressed, it opens the camera, you take a photo and when you select "Use Photo", I want it saved to the photo library.

I am able to do all but save to the library. This is the code I have to open the camera:

enter image description here


Solution

  • Use below code for an image taken from Photo Gallery and save inside photo library.

    Code Support for Swift 3.1 & 4.0 version:

    First, we have to do the setup for Permissions inside Project's .plist file:-

    1) Camera

    <key>NSCameraUsageDescription</key>
    <string>This app will use camera.</string>
    

    2) Photo Library

    <key>NSPhotoLibraryUsageDescription</key>
    <string>You can select photos to attach to reports.</string>
    

    3) Save to Photo Library

    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>Please allow access to save photo in your photo library</string>
    

    We need to open .pilst file as a Source code type then add permissions inside -

    open .plist file


    After That


    import UIKit
    
    class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate  {
    
        @IBOutlet weak var imageTake: UIImageView!
    
      var imagePicker: UIImagePickerController!
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        //MARK: - Take image
        @IBAction func takePhoto(_ sender: UIButton) {
            imagePicker =  UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            present(imagePicker, animated: true, completion: nil)
        }
    
        //MARK: - Saving Image here
        @IBAction func save(_ sender: AnyObject) {
            UIImageWriteToSavedPhotosAlbum(imageTake.image!, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
        }
    
        //MARK: - Add image to Library
        func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
            if let error = error {
                // we got back an error!
                let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert)
                ac.addAction(UIAlertAction(title: "OK", style: .default))
                present(ac, animated: true)
            } else {
                let ac = UIAlertController(title: "Saved!", message: "Your altered image has been saved to your photos.", preferredStyle: .alert)
                ac.addAction(UIAlertAction(title: "OK", style: .default))
                present(ac, animated: true)
            }
        }
    
        //MARK: - Done image capture here
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
             imagePicker.dismiss(animated: true, completion: nil)
            imageTake.image = info[UIImagePickerControllerOriginalImage] as? UIImage
        }
    
    }
    

    Swift 4.2 Code update -

     class ViewController: UIViewController, UINavigationControllerDelegate  {
    
        @IBOutlet weak var imageTake: UIImageView!
        var imagePicker: UIImagePickerController!
    
        enum ImageSource {
            case photoLibrary
            case camera
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        //MARK: - Take image
        @IBAction func takePhoto(_ sender: UIButton) {
            guard UIImagePickerController.isSourceTypeAvailable(.camera) else {
                selectImageFrom(.photoLibrary)
                return
            }
            selectImageFrom(.camera)
        }
    
        func selectImageFrom(_ source: ImageSource){
            imagePicker =  UIImagePickerController()
            imagePicker.delegate = self
            switch source {
            case .camera:
                imagePicker.sourceType = .camera
            case .photoLibrary:
                imagePicker.sourceType = .photoLibrary
            }
            present(imagePicker, animated: true, completion: nil)
        }
    
        //MARK: - Saving Image here
        @IBAction func save(_ sender: AnyObject) {
            guard let selectedImage = imageTake.image else {
                print("Image not found!")
                return
            }
            UIImageWriteToSavedPhotosAlbum(selectedImage, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)
        }
    
        //MARK: - Add image to Library
        @objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
            if let error = error {
                // we got back an error!
                showAlertWith(title: "Save error", message: error.localizedDescription)
            } else {
                showAlertWith(title: "Saved!", message: "Your image has been saved to your photos.")
            }
        }
    
        func showAlertWith(title: String, message: String){
            let ac = UIAlertController(title: title, message: message, preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default))
            present(ac, animated: true)
        }
     }
    
     extension ViewController: UIImagePickerControllerDelegate{
    
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
            imagePicker.dismiss(animated: true, completion: nil)
            guard let selectedImage = info[.originalImage] as? UIImage else {
                print("Image not found!")
                return
            }
            imageTake.image = selectedImage
        }
    }