Swift 3从本地directory下载图片
问题描述:
我是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
}
}
但我不能有什么工作。 任何想法如何我可以实现这一点?
谢谢你的帮助。
答
您需要保存对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
}
}
当然,你会想要添加适当的错误检查,你自己的大小,命名,跟踪等......但我认为这是你想要的方向。
您需要使用'imageUrlPath.path'而不是'imageUrlPath.absoluteString' –
感谢您的帮助。我没有任何错误,但图像不显示在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
打印路径并检查图像是否存在 –