2017-03-27 7 views
1

Ich bin neu bei iOS dev und kann nicht herausfinden, wie man ein Bild in einem ImageView aus einem lokalen Verzeichnis lädt. Ich verwende imagePickerController, um ein Bild auszuwählen, seine Informationen abzurufen und diese Informationen dann zur Anzeige des Bildes in der imageView zu verwenden.Swift 3 lade Bild aus dem lokalen Verzeichnis

Hier ist der Code ist, das Bild und die Info-Wörterbuch zu holen:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     let image    = info[UIImagePickerControllerOriginalImage] as! UIImage 

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

     imagesList.append(localPath) 

     picker.dismiss(animated: true, completion: nil) 
    } 

Dann, und hier ist, wo ich für einige Hilfe bin auf der Suche, ich möchte entweder localPath oder imageUrl laden das Bild verwenden, in einem anderen imageView aber kann nicht herausfinden, wie. Ich versuchte

func changeImage(_ sender: Any) { 
     if imagesList.count > 0 { 
      let imageUrlPath = imagesList[indexList] 
      let urlString: String = imageUrlPath.absoluteString 

      imageView.image = UIImage(contentsOfFile: urlString) 

      indexList = (indexList + 1) % imagesList.count 
     } 
    } 

Aber ich kann nicht etwas Arbeits haben. Irgendeine Idee, wie ich das erreichen kann?

Vielen Dank für Ihre Hilfe.

+0

Sie müssen 'imageUrlPath.path' anstelle von' imageUrlPath.absoluteString' verwenden –

+0

Danke für Ihre Hilfe. Ich habe keinen Fehler, aber das Bild wird nicht in der Bildansicht angezeigt. Wenn ich URLString drucke, enthält es nur "/asset.JPG" und ich denke nicht, dass das reicht. Was contentsOfFile enthalten soll: der gesamte Pfad (file: /// Benutzer/me/Library/Entwickler/CoreSimulator/Devices/BF7D44E4-26DD-43EE-5543-D7AB7654F8DC/data/Container/Data/Application/C9561694- 34E9-46AD-83AA-38F067557F86/Dokumente/Anlage.JPG)? Oder etwas wie "assets-library: //asset/asset.JPG? Id = 9A443DCB-EC44-42B8-8773-B597CF782EDD & ext = JPG" – radar

+0

Drucken Sie den Pfad und überprüfen Sie, ob das Bild existiert oder nicht –

Antwort

2

Sie sollten einen Verweis auf PHAsset-Objekte speichern, nicht URL-Strings.

Beginnen Sie mit Ihrem Array als Definition:

var imagesList = [PHAsset]() 

Dann in didFinishPickingMediaWithInfo:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

    dismiss(animated: true) 

    // get the selected image as a UIImage object 
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
    imageView.image = image 

    // save a PHAsset reference in imagesList array for later use 
    if let imageUrl = info[UIImagePickerControllerReferenceURL] as? URL{ 

     let assets = PHAsset.fetchAssets(withALAssetURLs: [imageUrl], options: nil) 

     if let p = assets.firstObject { 

      imagesList.append(p) 

     } 

    } 

} 

nächsten ein paar "Convenience" Funktionen hinzufügen:

func getAssetFullsize(asset: PHAsset) -> UIImage { 
    let manager = PHImageManager.default() 
    let option = PHImageRequestOptions() 
    var img = UIImage() 
    option.isSynchronous = true 
    let w = asset.pixelWidth 
    let h = asset.pixelHeight 
    manager.requestImage(for: asset, targetSize: CGSize(width: w, height: h), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in 
     img = result! 
    }) 
    return img 
} 

func getAssetThumbnail(asset: PHAsset) -> UIImage { 
    let manager = PHImageManager.default() 
    let option = PHImageRequestOptions() 
    var thumbnail = UIImage() 
    option.isSynchronous = true 
    let w = 100 
    let h = 100 
    manager.requestImage(for: asset, targetSize: CGSize(width: w, height: h), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in 
     thumbnail = result! 
    }) 
    return thumbnail 
} 

und schließlich, Wenn Sie das tatsächliche Bild erhalten möchten:

func changeImage(_ sender: Any) { 
    if imagesList.count > 0 { 

     // get the full-size image from PHAsset 
     imageView.image = getAssetFullsize(asset: imagesList[indexList]) 

     // or, just get a thumbnail-sized image 
     //imageView.image = getAssetThumbnail(asset: imagesList[indexList]) 

     indexList = (indexList + 1) % imagesList.count 

    } 
} 

Natürlich möchten Sie eine angemessene Fehlerprüfung hinzufügen, Ihre eigene Größe, Benennung, Tracking, etc ... aber ich denke, das ist die Richtung, die Sie gehen wollen.

+0

Vielen Dank DonMag, ich antworte später noch, wenn ich das teste. – radar

+0

Genau das habe ich gesucht. Vielen Dank. – radar

Verwandte Themen