Swift 3 - 如何在应用程序中使用照片库图片?

Posted

技术标签:

【中文标题】Swift 3 - 如何在应用程序中使用照片库图片?【英文标题】:Swift 3 - How do I use a photolibrary picture in an app? 【发布时间】:2017-01-08 19:12:05 【问题描述】:

如何在我的应用中使用照片库中的图片?我已经完成了有关创建照片应用程序的教程。这一切都很好。我有一个UIPickerController,可以用相机拍照,保存到库中,或者从库中选择一张图片,然后放到屏幕上。但是……

我想要的是用户选择一张图片,记住图片的名称或编号什么的,然后在另一个页面上使用库中的这张图片。

就像选择头像一样。将图片保存在某处,每当用户进入个人资料页面时,打开之前选择的头像图片。所以我需要的是图片的“名称”(表示),但我找不到。我该怎么做?

(下面的代码只是工作的cam / lib应用程序部分,但它保存了没有名称的图片,这就是问题:如何找出之前保存的图片?)抱歉,变量名是荷兰语。

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate 

    @IBOutlet weak var plaatje: UIImageView!

    @IBAction func saveknop(_ sender: UIButton) 
        let imageData = UIImageJPEGRepresentation(plaatje.image!, 0.6)
        let compressedfoto = UIImage(data: imageData!)
        UIImageWriteToSavedPhotosAlbum(compressedfoto!, nil, nil, nil)
        saveNotice()
    

    @IBAction func cameraknop(_ sender: UIButton) 
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) 
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.camera
            imagePicker.allowsEditing = false
            self.present(imagePicker, animated: true, completion: nil)
        
    

    @IBAction func biepknop(_ sender: Any) 
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) 
            let imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
            imagePicker.allowsEditing = true
            self.present(imagePicker, animated: true, completion: nil)
        
    


    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo image: UIImage!, editingInfo: [NSObject : AnyObject]!) 
        plaatje.image = image
        self.dismiss(animated: true, completion: nil)
    

    func saveNotice() 
        let alert = UIAlertController(title: "foto genomen", message: "je foto is bewaard in de biep", preferredStyle: .alert)
        let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil)
        alert.addAction(defaultAction)
        present(alert, animated: true, completion: nil)

    

【问题讨论】:

P.S.我意识到(感谢 Jared!)如果图片应该被用户删除,我会得到一个错误,但我希望为此构建一个解决方案(显示一个问号或其他东西)。这样用户就可以制作一张新照片。 这就是答案吗? ***.com/questions/27854937/… 【参考方案1】:

我找到的一个解决方案是使用 UIImageJPEGRepresentationUIImagePNGRepresentation 将图像转换为 Data 对象。从那里您可以使用 write(to:) 方法将其保存到您希望应用使用的特定 URL。

this SO 问题的答案显示了几种存储图像的方法。这可能会有所帮助。

【讨论】:

【参考方案2】:

我之前也遇到过同样的问题,这对我有用:

使用以下方法保存图片:

func saveImage(image: UIImage, path: String ) 
    let pngImageData = UIImagePNGRepresentation(image)

    do 
        try pngImageData?.write(to: URL(fileURLWithPath: path), options: .atomic)
     catch 
        print(error)
    

使用以下方式加载保存的图像:

func loadImageFromName(name: String) -> UIImage? 

    let path = self.fileInDocumentsDirectory(filename: name)

    let image = UIImage(contentsOfFile: path)

    if image == nil 
        print("Image not available at: \(path)")
    

    return image


func fileInDocumentsDirectory(filename: String) -> String 
    let documentsFolderPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as NSString
    return documentsFolderPath.appendingPathComponent(filename)

像这样调用保存方法:

saveImage(image: image, path: fileInDocumentsDirectory(filename: "someId"))

祝你好运!希望这会有所帮助。

【讨论】:

【参考方案3】:

在与建议的斗争中,我找到了另一种解决方案,它非常简单。但它有效!奇怪的。它不是最好的,但现在我会使用它,直到我了解 iPhone 上的目录和文件系统。

附:归功于:http://theswiftguy.com/index.php/2016/11/10/how-to-save-an-image-locally-in-xcode-8-swift-3-0/

        //Encoding
    let image = UIImage(named: "dog.png")
    let imageData:NSData = UIImagePNGRepresentation(image!)! as NSData

    //Saved image
    UserDefaults.standard.set(imageData, forKey: "savedImage")

    //Decode
    let data = UserDefaults.standard.object(forKey: "savedImage") as! NSData
    myImageView.image = UIImage(data: data as Data)

【讨论】:

以上是关于Swift 3 - 如何在应用程序中使用照片库图片?的主要内容,如果未能解决你的问题,请参考以下文章

Swift要求用户允许访问照片库

如何在 Swift 中保存从 UIImagePickerController 中挑选的图像?

如何使用 Swift 3 从 Facebook SDK 下载照片?

如何在swift 3中使用imageview嵌套标签

如何将图片分配给 UIImageView (Swift 3)

图片不会在我的 Alamofire .post 请求中发送到我的后端 - Swift 3