2015-01-31 2 views
6

Я пытаюсь предоставить пользователю выбор изображения из библиотеки фотографий. Таким образом, я использую UIImagePickerController для выбора. Но здесь возникает проблема с получением исходного URL-адреса в файловой системе (мне это нужно для CKAsset).Получение URL-адреса UIImage, выбранного из UIImagePickerController

Мой код.

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 это имя образа.

Затем я доступ к моей папке Документы и пытается найти там файл с пути:

/Пользователи/Евгений/Library/Developer/CoreSimulator/Devices/3C5E9A23-8220-4B37-BD14-F1E42EEC2C7C не /data/Containers/Data/Application/20EBAAE2-6C6F-4651-A48F-16A222CCB3A2/Documents/asset.JPG

Cryptic как хорошо, но, кажется, реальный путь для не существующего изображения ... нет изображения с этим путем можно найти. И это заставляет меня болеть.

Должен ли я сохранять изображение с самого начала? Или есть ли другой способ?

Я просмотрел несколько руководств, используя API AssetsLibrary, но я не нашел ничего полезного для решения моей проблемы. Заранее спасибо!

ответ

24

Хорошо, я решил проблему.

Все, что вам нужно сделать, это просто захватить изображение (info[UIImagePickerControllerOriginalImage] as UIImage) и сохранить в данном каталоге. Если вам нужно сохранить только 1 изображение, он отлично работает. Идентификатор кода ниже.

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) 

} 
+3

Не могли бы вы уточнить свой ответ для Swift 2? Спасибо! –

+5

не работает в Swift 3, я преобразовал код, чтобы он скомпилировался, но возвращенный путь не указывает на выбранное изображение – zumzum

+0

для Swift 3, проверьте это решение: http://stackoverflow.com/questions/4957972/iphone-uiimagepickercontroller -save-the-image-to-app-folder/43456006 # 43456006 – XueYu

3
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) 
} 
+0

@Peter Kreinz, надеюсь, что это поможет – DHuang

1

проверить это решение.

import AssetsLibrary 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
      self.imagePicker = picker 
      if let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
      let controller = CropViewController(image: selectedImage) 
      controller.delegate = self 
      picker.presentViewController(controller, animated: true, completion: nil) 
      } 

     else if let imageUrl = info[UIImagePickerControllerReferenceURL] as? NSURL{ 
      let assetLibrary = ALAssetsLibrary() 
      assetLibrary.assetForURL(imageUrl , resultBlock: { (asset: ALAsset!) -> Void in 
      if let actualAsset = asset as ALAsset? { 
       let assetRep: ALAssetRepresentation = actualAsset.defaultRepresentation() 
       let iref = assetRep.fullResolutionImage().takeUnretainedValue() 
       let image = UIImage(CGImage: iref) 
       let controller = CropViewController(image: image) 
       controller.delegate = self 
       picker.presentViewController(controller, animated: true, completion: nil) 
      } 
      }, failureBlock: { (error) -> Void in 
      }) 
     } 
     } 
0

В СВИФТ 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) 
} 
Смежные вопросы