2015-01-31 6 views
6

Ich versuche, eine Benutzerauswahl eines Bilds aus der Fotobibliothek bereitzustellen. Also benutze ich UIImagePickerController zur Auswahl. Aber hier kommt ein Problem mit der ersten URL im Dateisystem (ich brauche das für CKAsset).Abrufen der URL von UIImage ausgewählt aus UIImagePickerController

Mein 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 ist ein bisschen kryptisch. Es beschreibt die Asset-URL, aber keine Datei im Dateisystem. Und es sieht so aus: assets-library://asset/asset.JPG?id=B6C0A21C-07C3-493D-8B44-3BA4C9981C25&ext=JPG.

Gemäß dieser Logik ist der Pfad/asset.JPG, wobei asset.JPG ein Name des Bildes ist.

Dann bin ich Zugriff auf meine Dokumente-Ordner und versuchen, dort eine Datei mit dem Pfad zu finden:

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

Cryptic als gut, aber scheint für ein nicht vorhandenes Bild einen echten Weg zu sein ... kein Bild mit diesem Pfad kann gefunden werden. Und das macht mich krank.

Muss ich ein Bild von Anfang an speichern? Oder gibt es noch einen anderen Weg?

Ich habe mehrere Tutorials unter Verwendung AssetsLibrary API durchgesehen, aber ich habe nichts nützliches gefunden, um mein Problem zu lösen. Vielen Dank im Voraus!

Antwort

24

Okay, ich habe das Problem gelöst.

Alles, was Sie tun müssen, ist einfach das Bild (info[UIImagePickerControllerOriginalImage] as UIImage) zu greifen und in das angegebene Verzeichnis zu speichern. Wenn Sie nur 1 Bild speichern müssen, funktioniert es großartig. Die Code-ID unten.

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

Können Sie bitte Ihre Antwort für Swift 2 aktualisieren? Vielen Dank! –

+5

funktioniert nicht in Swift 3, ich konvertierte den Code, damit es kompilieren, aber der zurückgegebene Pfad zeigt nicht auf das ausgewählte Bild – zumzum

+0

für Swift 3, überprüfen Sie diese Lösung: http://StackOverflow.com/Questions/4957972/Iphone-UIImagePickerController -save-the-image-to-app-ordner/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, hoffe dieser hilft – DHuang

1

Check diese Lösung.

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

In SWIFT 4 u Kann diesen Versuchen, Es ist richtig funktioniert.

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