微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift应用程序未将照片保存到图库

如何解决Swift应用程序未将照片保存到图库

我编写了这个程序,将滤镜应用于图像,然后用户可以将其保存到库中,但是保存功能无论如何都不会起作用,甚至不会出错。

代码如下:

import UIKit

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    @IBOutlet var imageView: UIImageView!
    @IBOutlet var filterName: UILabel!
    let context = CIContext()
    var original: UIImage!
    
    override func viewDidLoad() {
        filterName.text = ""
    }
    
    @IBAction func choosePhoto(_ sender: UIBarButtonItem) {
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            let picker = UIImagePickerController()
            picker.delegate = self
            picker.sourceType = .photoLibrary
            self.navigationController?.present(picker,animated: true,completion: nil)
        }
    }
    
    @IBAction func applySepia() {
        if original == nil {
            return
        }

        let filter = CIFilter(name: "CISepiaTone")
        print("Sepia")
        filterName.text = "Sepia"
        filter?.setValue(CIImage(image: original),forKey: kCIInputimageKey)
        filter?.setValue(1.0,forKey: kCIInputIntensityKey)
        display(filter: filter!)
    }

    @IBAction func applyNoir() {
        if original == nil {
            return
        }

        let filter = CIFilter(name: "CIPhotoEffectNoir")
        print("Noir")
        filterName.text = "Noir"
        filter?.setValue(CIImage(image: original),forKey: kCIInputimageKey)
        display(filter: filter!)
    }

    @IBAction func applyVintage() {
        if original == nil {
            return
        }
        
        let filter = CIFilter(name: "CIPhotoEffectProcess")
        print("Vintage")
        filterName.text = "Vintage"
        filter?.setValue(CIImage(image: original),forKey: kCIInputimageKey)
        display(filter: filter!)
    }


    
    @IBAction func applySomething() {
        if original == nil {
            return
        }
        
        let number = Int.random(in: 1 ... 3)
        switch number {
        case 1:
            print("Vignette")
            let filter = CIFilter(name: "CIVignette")
            filterName.text = "Vignette"
            filter?.setValue(CIImage(image: original!),forKey: kCIInputimageKey)
            filter?.setValue(0.5,forKey: kCIInpuTradiusKey)
            filter?.setValue(2.5,forKey: kCIInputIntensityKey)
            display(filter: filter!)
        case 2:
            print("Box Blur")
            let filter = CIFilter(name: "CIBoxBlur")
            filterName.text = "Box Blur"
            filter?.setValue(CIImage(image: original),forKey: kCIInputimageKey)
            filter?.setValue(30,forKey: kCIInpuTradiusKey)
            display(filter: filter!)
        case 3:
            print("Crop")
            let filter = CIFilter(name: "CICrop")
            filterName.text = "Crop"
            filter?.setValue(CIImage(image: original),forKey: kCIInputimageKey)
            filter?.setValue([0,300,300],forKey: kCIAttributeTypeRectangle)
            display(filter: filter!)
        default:
            let filter = CIFilter(name: "CISepiaTone")
            print("Sepia")
            filterName.text = "Sepia"
            filter?.setValue(CIImage(image: original),forKey: kCIInputimageKey)
            filter?.setValue(1.0,forKey: kCIInputIntensityKey)
            display(filter: filter!)
        }
    }
    
    @IBAction func savePhoto() {
        if original == nil {
            return
        }
        
        UIImageWritetoSavedPhotosAlbum(imageView.image!,self,nil,nil)
        // add an alert when saved
        let alert = UIAlertController(title: "Alert",message: "Saved Successfully",preferredStyle: UIAlertController.Style.alert)
        alert.addAction(UIAlertAction(title: "Ok",style: UIAlertAction.Style.default,handler: nil))
        self.present(alert,completion: nil)
        
    }
    
    
    func display(filter: CIFilter) {
        let output = filter.outputimage!
        imageView.image = UIImage(cgImage: self.context.createCGImage(output,from: output.extent)!)
    }

    func imagePickerController(
        _ picker: UIImagePickerController,didFinishPickingMediawithInfo info: [UIImagePickerController.InfoKey : Any]
    ) {
        self.navigationController?.dismiss(animated: true,completion: nil)
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            imageView.image = image
            original = image
        }
    }
}

还考虑到我在info.plist文件添加了权限。有小费吗?谢谢。

编辑:我更改了savePhoto函数并创建了一个新的函数

    @IBAction func savePhoto() {
        if original == nil {
            return
        }
        
        UIImageWritetoSavedPhotosAlbum(imageView.image!,#selector(image(_:didFinishSavingWithError:contextInfo:)),nil)
    }
    
    @objc func image(_ image: UIImage,didFinishSavingWithError error: NSError?,contextInfo: UnsafeRawPointer) {
        if let error = error {
            let alert = UIAlertController(title: "Error",message: error.localizedDescription,preferredStyle: UIAlertController.Style.alert)
            alert.addAction(UIAlertAction(title: "Ok",handler: nil))
            self.present(alert,completion: nil)
            print("Error")
        }
        else {
            let alert = UIAlertController(title: "Alert",completion: nil)
            print("Saved")
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。