如何在Swift中保存从UIImagePickerController中获取的图像?

我正在构build一个应用程序,让用户从照片库中选取图片。 我正在使用这个代码来保存它。

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保存图像,但是你可以保存所选图像的path,保存并加载“if let …”

但我不知道如何做到这一点(findpath并保存)。 这个想法是为用户select视图背景图像,有点像Whatsapp的。

如果我错了,你不能存储的path,是否有任何简单的方法来保存采摘的图像,而不使用在线服务器?

您可以使用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") } 

有两种方法,一种是你正在描述的,但是相当混乱,我build议你的是将图像,转换成图像数据,并将其存储在您的应用程序本地,如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 } }