Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中保存从UIImagePickerController拾取的图像?_Ios_Swift_Uiimagepickercontroller - Fatal编程技术网

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

Ios 如何在Swift中保存从UIImagePickerController拾取的图像?,ios,swift,uiimagepickercontroller,Ios,Swift,Uiimagepickercontroller,我正在构建一个应用程序,让用户从其照片库中选择一幅图像。我用这个代码来保存它 func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { imgPicker.dismissViewControllerAnimated(true, completion: nil) NSUs

我正在构建一个应用程序,让用户从其照片库中选择一幅图像。我用这个代码来保存它

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


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

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

//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数据库中或在user default中的数组中一样。然而,以用户默认值保存这么多数据并不是一个好的做法。所以,我会将它存储在本地,我不会使用凌乱的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”中]您刚刚为图像分配了一个常量,但没有保存它!是的,我相信,stack建议,作者也可以尝试一些东西。我给了您一个很好的开端。现在您可以将其保存到您想要保存的位置。在sqlite数据库中或在您最初尝试时的用户默认值中。也尝试按照建议进行操作。不要只看t代码。我建议使用核心数据。展示如何在核心中保存某些内容需要我向您展示如何创建核心数据模型和实体,然后展示如何创建NSManagedObject,以及您应该在核心数据教程中查找的所有内容。您不应该希望有人为您编写代码。请将其视为建设性建议。但第一种方法确实保存了拾取的图像,我可以将其加载到任何地方?如果是这样,我将使用较小的方法,因为图像在我的系统中只使用一次app@HenriqueDourado第一个和第二个可以在你的应用程序中的任何地方使用。我个人会使用第一个,因为它更简单,而且你不需要为这样的应用程序写入文件少量数据。顺便说一句,即使应用程序关闭并重新打开,也可以访问这两种方法。不适合在
NSUserDefaults
中存储数据,尤其是图像数据。