2016-02-28 153 views
2

我正在构建一个应用程序,让用户从其照片库中选取图像。我正在使用此代码来保存它。如何在Swift中保存从UIImagePickerController中拾取的图像?

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的保存图像,但可以保存摄取的图像的路径,将其保存,并加载它,“如果让......”

但我不知道如何做到这一点(找到路径并保存)。这个想法是让用户选择视图背景图像,就像Whatsapp一样。

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

+0

将图像写入文件。 – rmaddy

+0

这里是一个类似问题的链接[http://stackoverflow.com/questions/28066688/how-to-save-an-image-path-within-my-app] – Lucho

回答

9

,可以保存和使用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") 
} 

斯威夫特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") 
} 
+0

但是,第一种方法是否真的能保存采摘图像,我可以加载它到处?如果是这样,我会使用较小的一个,因为该图像只在我的应用中使用过一次 –

+0

@HenriqueDourado第一个和第二个可以在您的应用中的任何位置使用。我个人会使用第一个,因为它比较简单,而且您不需要为如此少量的数据写入文件。顺便说一句,这两种方法都可以访问,即使应用程序关闭并重新打开 – brimstone

+0

它的工作,谢谢! –

-1

有两种方法,一种是你所描述的,但是非常混乱,我建议你采取的形象,成为图像数据,并将其存储在您的应用程序本地,如在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 
    } 
} 
+0

但是在函数“saveImage”中,您只是为图像分配了一个常量,但并未保存! –

+0

是的,我相信,堆栈建议,作者也尝试一些东西。我给了你一个不错的开局。现在是你想要保存的地方。在一个SQLite数据库或用户默认,当你最初尝试。 – Natasha

+0

也尝试按照建议。不要只看代码。我建议使用核心数据。展示如何在核心中保存某些内容需要我向您展示如何创建核心数据模型和实体,然后介绍如何创建NSManagedObject以及您应该在核心数据教程中查找的所有内容。你不应该让别人为你写代码。请把它作为建设性的建议。 – Natasha

相关问题