Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting URL of UIImage selected from UIImagePickerController

Tags:

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!

like image 615
mozharovsky Avatar asked Jan 31 '15 19:01

mozharovsky


2 Answers

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)  } 
like image 101
mozharovsky Avatar answered Oct 10 '22 22:10

mozharovsky


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) } 
like image 29
Jaydip Avatar answered Oct 10 '22 23:10

Jaydip