从 UIImagePickerController 获取 URL 个 UIImage

Getting URL of UIImage from UIImagePickerController

我正在尝试获取从 Swift 中的库导入的图像的 URL,以便使用 transferFile(_:metadata) 将其发送到 Apple Watch,但我在 NSURL

这是我的代码:

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!)
{
    imagePicked.image = image    
    let imageUrl = editingInfo[UIImagePickerControllerReferenceURL] as! NSURL
    let imageName = imageUrl.path!.lastPathComponent
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String!
    let localPath = documentDirectory.stringByAppendingPathComponent(imageName)
    let image = editingInfo[UIImagePickerControllerOriginalImage]as! UIImage
    let data = UIImagePNGRepresentation(image)

    data!.writeToFile(localPath, atomically: true)

    let photoURL = NSURL(fileURLWithPath: localPath)

    self.dismissViewControllerAnimated(true, completion: nil);
}

我在使用 *imageName 和 *localPath 时遇到错误,因为它说:

'lastPathComponent' is unavailable: Use lastPathComponent on NSURL instead. 'stringByAppendingPathComponent' is unavailable: Use URLByAppendingPathComponent on NSURL instead.

但是我在 Swift 2.0 和 Xcode 7. 我哪里错了?

Apple 在其最新版本 (iOS 9) 中更改了 NSStringNSURL 库中的某些内容,但这些方法可从 iOS 4 获得。您可以查看相关Apple Forum Post了解更多详情。

要修复此错误,您需要更改如下代码:

Swift 2:

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!)
{
    let imageUrl          = editingInfo[UIImagePickerControllerReferenceURL] as! NSURL
    let imageName         = imageUrl.lastPathComponent
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as String!
    let photoURL          = NSURL(fileURLWithPath: documentDirectory)
    let localPath         = photoURL.URLByAppendingPathComponent(imageName!)
    let image             = editingInfo[UIImagePickerControllerOriginalImage]as! UIImage
    let data              = UIImagePNGRepresentation(image)

    data!.writeToFile(localPath.absoluteString, atomically: true)

    self.dismissViewControllerAnimated(true, completion: nil);
}

Swift 3:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    let imageUrl          = info[UIImagePickerControllerReferenceURL] as! NSURL
    let imageName         = imageUrl.lastPathComponent
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    let photoURL          = NSURL(fileURLWithPath: documentDirectory)
    let localPath         = photoURL.appendingPathComponent(imageName!)
    let image             = info[UIImagePickerControllerOriginalImage]as! UIImage
    let data              = UIImagePNGRepresentation(image)

    do
    {
        try data?.write(to: localPath!, options: Data.WritingOptions.atomic)
    }
    catch
    {
        // Catch exception here and act accordingly
    }

    self.dismiss(animated: true, completion: nil);
}

参考:

  1. lastPathComponent
  2. URLByAppendingPathComponent:
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)
}

从 iOS 11 开始,您可以使用键 UIImagePickerControllerImageURL.[= 从信息字典中获取图像 URL 11=]

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let imageURL = info[UIImagePickerControllerImageURL] as? URL
}