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

Posted

技术标签:

【中文标题】如何在 Swift 中保存从 UIImagePickerController 中挑选的图像?【英文标题】:How to save an image picked from a UIImagePickerController in Swift? 【发布时间】:2016-02-28 17:18:37 【问题描述】:

我正在构建一个应用程序,让用户可以从其照片库中选择一张图片。我正在使用此代码来保存它。

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) 
    imgPicker.dismissViewControllerAnimated(true, completion: nil)
    NSUserDefaults.standardUserDefaults().setValue(image, forKey: "bgImage")


func imagePickerControllerDidCancel(picker: UIImagePickerController) 
    imgPicker.dismissViewControllerAnimated(true, completion: nil)

后来我发现你不能用 NSUserDefaults 保存图像,但是你可以保存选择的图像的路径,保存它并用“if let...”加载它

但我不知道该怎么做(找到路径并保存它)。这个想法是让用户选择视图背景图像,有点像 Whatsapp 的做法。

如果我错了并且您无法存储路径,有没有简单的方法可以在不使用在线服务器的情况下保存拾取的图像?

【问题讨论】:

将图像写入文件。 这里有一个类似问题的链接 [***.com/questions/28066688/… 【参考方案1】:

您可以使用 NSUserDefaults 保存和检索它:

//Save image
let img = UIImage() //Change to be from UIPicker
let data = UIImagePNGRepresentation(img)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "myImageKey")
NSUserDefaults.standardUserDefaults().synchronize()

//Get image
if let imgData = NSUserDefaults.standardUserDefaults().objectForKey("myImageKey") as? NSData 
    let retrievedImg = UIImage(data: imgData)

如果您愿意,也可以读取/写入文件:

//Save image
let img = UIImage() //Change to be from UIPicker
let data = UIImagePNGRepresentation(img)!
do 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    try data.writeToFile("\(documentsPath)myImage", options: [])

 catch 
    print("Error")


//Get image
do 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let readData = try NSData(contentsOfFile: "\(documentsPath)myImage", options: [])
    let retreivedImage = UIImage(data: readData)

catch 
    print("Error")

Swift 3

//Save image
let data = UIImagePNGRepresentation(pickedImage)!
do 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    try data.write(to: URL(string: "\(documentsPath)/myImage")!, options: .atomic)
 catch 
    print("Error")


//Get image
do 
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let readData = try Data(contentsOf: URL(string: "\(documentsPath)/myImage")!)
    let retreivedImage = UIImage(data: readData)
 catch 
    print("Error")

【讨论】:

但是第一种方法真的会保存拾取的图像并且我可以将它加载到任何地方吗?如果是这样,我会使用较小的,因为图像只在我的应用程序中使用过一次 @HenriqueDourado 第一个和第二个可以在您的应用程序的任何地方使用。我个人会使用第一个,因为它更简单,而且您实际上不需要为如此少量的数据写入文件。顺便说一句,即使应用程序关闭并重新打开,也可以访问这两种方法 不适合在NSUserDefaults中存储数据,尤其是图片数据。【参考方案2】:

有两种方法,一种是您所描述的,但很混乱,一种是我建议您获取图像,将其转换为图像数据并将其存储在本地应用程序中,例如存储在 sqlite 数据库或用户默认数组。但是,在用户默认值中保存这么多数据并不是一个好习惯。所以,我会在本地存储它,我不会用凌乱的sqlite代码来做,而是用核心数据来做。

class AddImageViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate 

    @IBOutlet var popUpThePickerButton: UIButton! //click on this button to appear the imagePicker
    @IBOutlet var addPictureButton: UIButton! //when this button clicked saveImage method is called and there you save the imageData wherever you want

    let picker = UIImagePickerController()
    var selectedImage : UIImage!

    override func viewDidLoad() 
        super.viewDidLoad()
        picker.delegate = self
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    // when popUpThePickerButton is clicked
    @IBAction func selectPictureFromPhotos(sender: UIButton)  
        picker.editing = false
        picker.sourceType = .PhotoLibrary

        presentViewController(picker, animated: true, completion: nil)
    

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 
        self.selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
        dismissViewControllerAnimated(true, completion: nil)
    

    func imagePickerControllerDidCancel(picker: UIImagePickerController) 
        dismissViewControllerAnimated(true, completion: nil)
    

// then save this image data in your database and when you want to show that image you can just turn the image data to image again

    @IBAction func saveImage(sender: UIButton) 
        let imageData = UIImagePNGRepresentation(self.selectedImage)
        //save this image data in database
    

【讨论】:

但在“saveImage”函数中,您只是为图像分配了一个常量,但没有保存它! 是的,我相信,堆栈建议,作者也可以尝试一些东西。我给了你一个很好的开端。现在它是你想要保存它的地方。在您最初尝试的 sqlite 数据库或用户默认值中。 也尝试遵循建议。不要只看代码。我建议使用核心数据。展示如何在核心中保存内容需要我向您展示如何创建核心数据模型和实体,然后如何创建 NSManagedObject 以及您应该在核心数据教程中查找的所有内容。您不应该希望有人为您编写代码。请把它当作建设性的建议。

以上是关于如何在 Swift 中保存从 UIImagePickerController 中挑选的图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从数据库中保存和获取一个对象?

如何在 Swift 中从 NSData 显示 PDF - 如何将 PDF 保存到文档文件夹 Swift - 如何在 Swift 中通过 WebView 从保存的 NSData 显示 PDF

如何从图像文字数组中选择单个图像并将其保存为swift 5中的用户默认值

如何从 Swift 的后台线程中从 CoreData 中获取未保存的数据?

SWIFT - 是不是可以从 AVAudioEngine 或 AudioPlayerNode 保存音频?如果是,如何?

从 Firebase 读取数据并保存到数组中 (Swift)