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

How to save an image picked from a UIImagePickerController in Swift?

我正在开发一个应用程序,让用户可以从照片库中选择一张图片。我用这个代码来保存它。

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的做法。

如果我错了,你不能存储路径,有什么简单的方法可以在不使用在线服务器的情况下保存选择的图像?

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

有两种方法,一种是你描述的,但那很乱,我建议你的一种是拍摄图像,转换为图像数据并将其存储在本地应用程序中,就像在 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
    }
}