I'm trying to provide a user selection of an image from Photo Library. Thus I'm using UIImagePickerController
for selecting. But here comes an issue with getting its initial URL in the file system (I need this for CKAsset
).
My code.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { let imageURL = info[UIImagePickerControllerReferenceURL] as NSURL let path = imageURL.path! let imageName = path.lastPathComponent let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let documentDirectory = paths.first as String! let localPath = documentDirectory + "/" + imageName let imageData = NSData(contentsOfFile: localPath)! let image = UIImage(data: imageData)! picker.dismissViewControllerAnimated(true, completion: nil) }
imageURL is kinda cryptic. It describes Asset URL, but not one in File System. And it looks like: assets-library://asset/asset.JPG?id=B6C0A21C-07C3-493D-8B44-3BA4C9981C25&ext=JPG
.
According to this logic the path is /asset.JPG
where asset.JPG
is a name of the image.
Then I'm accessing my Documents folder and trying to find there a file with path:
/Users/Eugene/Library/Developer/CoreSimulator/Devices/3C5E9A23-8220-4B37-BD14-F1E42EEC2C7C/data/Containers/Data/Application/20EBAAE2-6C6F-4651-A48F-16A222CCB3A2/Documents/asset.JPG
Cryptic as well but seems to be a real path for a not existing image... No image with that path can be found. And this makes me sick.
Do I have to save an image from the beginning? Or is there any other way to go?
I've looked through several tutorials using AssetsLibrary API but I didn't find anything useful to solve my problem. Thank you in advance!
Okay, I've solved the issue.
All you have to do is simply grab the image (info[UIImagePickerControllerOriginalImage] as UIImage
) and save to the given directory. If you need to save only 1 picture it works great. The code id below.
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { let imageURL = info[UIImagePickerControllerReferenceURL] as NSURL let imageName = imageURL.path!.lastPathComponent let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String let localPath = documentDirectory.stringByAppendingPathComponent(imageName) let image = info[UIImagePickerControllerOriginalImage] as UIImage let data = UIImagePNGRepresentation(image) data.writeToFile(localPath, atomically: true) let imageData = NSData(contentsOfFile: localPath)! let photoURL = NSURL(fileURLWithPath: localPath) let imageWithData = UIImage(data: imageData)! picker.dismissViewControllerAnimated(true, completion: nil) }
In SWIFT 4 u Can Try This, It's working properly.
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let imgUrl = info[UIImagePickerControllerImageURL] as? URL{ let imgName = imgUrl.lastPathComponent let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first let localPath = documentDirectory?.appending(imgName) let image = info[UIImagePickerControllerOriginalImage] as! UIImage let data = UIImagePNGRepresentation(image)! as NSData data.write(toFile: localPath!, atomically: true) //let imageData = NSData(contentsOfFile: localPath!)! let photoURL = URL.init(fileURLWithPath: localPath!)//NSURL(fileURLWithPath: localPath!) print(photoURL) } APPDEL.window?.rootViewController?.dismiss(animated: true, completion: nil) }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With