获取从UIImagePickerController中选择的UIImage的URL

问题描述 投票:17回答:8

我正在尝试向用户提供照片库中的图像选择。因此,我正在使用UIImagePickerController进行选择。但是,在文件系统中获取其初始URL会带来一个问题(CKAsset需要此文件)。

我的代码。

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有点神秘。它描述了资产URL,但没有描述文件系统中的一个。它看起来像:assets-library://asset/asset.JPG?id=B6C0A21C-07C3-493D-8B44-3BA4C9981C25&ext=JPG

根据此逻辑,路径/asset.JPG,其中asset.JPG是图像的名称。

然后,我正在访问我的Documents文件夹并尝试在其中找到具有路径的文件:

/ Users / Eugene / Library / Developer / CoreSimulator / Devices / 3C5E9A23-8220-4B37-BD14-F1E42EEC2C7C / data / Containers / Data / Application / 20EBAAE2-6C6F-4651-A48F-16A222CCB3A2 / Documents / asset.JPG

也很隐秘,但是对于不存在的图像来说似乎是真实的路径...找不到具有该路径的图像。这让我恶心。

我是否必须从头开始保存图像?还是还有其他路要走?

我已经使用AssetsLibrary API浏览了几本教程,但是没有发现任何有用的解决方案。预先谢谢!

ios swift ios8 uiimagepickercontroller nsurl
8个回答
33
投票

好的,我已经解决了这个问题。

您要做的就是简单地抓取图像(info[UIImagePickerControllerOriginalImage] as UIImage)并保存到给定目录。如果您只需要保存1张图片,那么效果很好。下面的代码ID。

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)

}

10
投票

SWIFT 4]中,您可以尝试使用,它工作正常。

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)
}

4
投票
  func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
//this block of code grabs the path of the file   
let imageURL = info[UIImagePickerControllerReferenceURL] as NSURL
let imagePath =  imageURL.path!
let localPath = NSURL(fileURLWithPath: NSTemporaryDirectory()).URLByAppendingPathComponent(imagePath)

 //this block of code adds data to the above path
 let path = localPath.relativePath!
 let imageName = info[UIImagePickerControllerOriginalImage] as UIImage
 let data = UIImagePNGRepresentation(imageName)
 data?.writeToFile(imagePath, atomically: true)

//this block grabs the NSURL so you can use it in CKASSET
 let photoURL = NSURL(fileURLWithPath: path)
 }

2
投票

检查此解决方案。


1
投票

快速4


1
投票

swift 4.2


0
投票
let imgUrl = info[UIImagePickerController.InfoKey.imageURL] as? URL

0
投票

对于Swift 5+,根据@Jaydip回答

© www.soinside.com 2019 - 2024. All rights reserved.