2017-03-27 56 views
1

我是iOS开发新手,无法弄清楚如何从本地目录加载imageView中的图像。 我使用imagePickerController来选取图像,获取其信息,然后使用这些信息在imageView中显示图像。Swift 3从本地directory下载图片

下面是代码挑图像和信息词典:

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

那时,这里就是我在寻找一些帮助,我希望为使用了localPath或IMAGEURL加载图像在另一个图像查看,但无法弄清楚如何。 我试过

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

但我不能有什么工作。 任何想法如何我可以实现这一点?

谢谢你的帮助。

+0

您需要使用'imageUrlPath.path'而不是'imageUrlPath.absoluteString' –

+0

感谢您的帮助。我没有任何错误,但图像不显示在imageView中。如果我打印urlString,它只包含“/asset.JPG”,我认为这不够。 什么contentsOfFile应该包含:整个路径(file:/// Users/me/Library/Developer/CoreSimulator/Devices/BF7D44E4-26DD-43EE-5543-D7AB7654F8DC/data/Containers/Data/Application/C9561694- 34E9-46AD-83AA-38F067557F86 /文档/ asset.JPG)?或者像“assets-library://asset/asset.JPG?id = 9A443DCB-EC44-42B8-8773-B597CF782EDD&ext = JPG” – radar

+0

打印路径并检查图像是否存在 –

回答

2

您需要保存对PHAsset对象的引用,而不是URL字符串。

开始定义你的阵列为:

var imagesList = [PHAsset]() 

然后,在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) 

     } 

    } 

} 

接下来,添加一对夫妇的 “方便” 功能:

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 
} 

最后,当你想得到实际的图像:

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 

    } 
} 

当然,你会想要添加适当的错误检查,你自己的大小,命名,跟踪等......但我认为这是你想要的方向。

+0

非常感谢DonMag,我会在测试后再回答更长的时间。 – radar

+0

这正是我所期待的。非常感谢你。 – radar