通过本地URL(Swift)从库中加载图像

时间:2017-02-05 10:57:38

标签: ios swift image nsurl phasset

我遇到了一个奇怪的行为:

imagePicker返回一个PHAsset,我执行以下操作并设法使用数据中的图像显示imageView:

asset.requestContentEditingInput(with: PHContentEditingInputRequestOptions()) { (input, _) in
    let url = input?.fullSizeImageURL

    let  imgV = UIImageView()

    let test_url = URL(string: (url?.absoluteString)!)

    print("><><><^^^><><>\(test_url)")
    //prints: ><><><^^^><><>Optional(file:///var/mobile/Media/DCIM/107APPLE/IMG_7242.JPG)
    let data = NSData(contentsOf: test_url! as URL)
    imgV.image = UIImage(data: data! as Data)
    imgV.backgroundColor = UIColor.cyan

    att.imageLocalURL = url?.absoluteString//// saving the string to use in the other class

    imgV.frame = CGRect(x: 0, y: 0, width: 100, height: 100)

    self.view.addSubview(imgV) /// just to test that the file exists and can produce an image

但是,当我在另一个班级中执行以下操作时:

if((NSURL( string: self.attachment.imageLocalURL! ) as URL!).isFileURL)// checking if is Local URL
    {


        let test_url = URL(string:  self.attachment.imageLocalURL!) // reading the value stored from before
        print("><><><^^^><><>\(test_url)")
        //prints :><><><^^^><><>Optional(file:///var/mobile/Media/DCIM/107APPLE/IMG_7242.JPG)
        let data = NSData(contentsOf: test_url! as URL)
        imageView.image = UIImage(data: data! as Data)

    }

数据为零!我做错了什么,URL的URL在两种情况下都是相同的!

2 个答案:

答案 0 :(得分:0)

应通过PHAsset类访问

PHImageManager个对象。如果你想同步加载图像我建议你做这样的事情:

func getImage(assetUrl: URL) -> UIImage?  {
        let asset = PHAsset.fetchAssets(withALAssetURLs: [assetUrl], options: nil)

        guard let result = asset.firstObject else {
            return nil
        }
        var assetImage: UIImage?
        let options = PHImageRequestOptions()
        options.isSynchronous = true
        PHImageManager.default().requestImage(for: result, targetSize: UIScreen.main.bounds.size, contentMode: PHImageContentMode.aspectFill, options: options) { image, info in
            assetImage = image
        }

        return assetImage
    }

你甚至可以编写一个UIImageView扩展来直接从PHAsset网址加载图像。

答案 1 :(得分:0)

var images:NSMutableArray = NSMutableArray()//保存获取的图像

func fetchPhotos ()
{
   images = NSMutableArray()
   //totalImageCountNeeded = 3
   self.fetchPhotoAtIndexFromEnd(0)
}

func fetchPhotoAtIndexFromEnd(index:Int)
{
    let status : PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
    if status == PHAuthorizationStatus.Authorized
    {
    let imgManager = PHImageManager.defaultManager()
    let requestOptions = PHImageRequestOptions()
    requestOptions.synchronous = true

    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: true)]

    if let fetchResult: PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
    {
        if fetchResult.count > 0
        {
                imgManager.requestImageForAsset(fetchResult.objectAtIndex(fetchResult.count - 1 - index) as! PHAsset, targetSize: CGSizeMake(self.img_CollectionL.frame.size.height/3, self.img_CollectionL.frame.size.width/3), contentMode: PHImageContentMode.AspectFill, options: requestOptions, resultHandler: { (image, _) in
                //self.images.addObject(image!)
                if image != nil
                {
                    self.images.addObject(image!)
                }
                if index + 1 < fetchResult.count && self.images.count < 20 //self.totalImageCountNeeded
                {
                    self.fetchPhotoAtIndexFromEnd(index + 1)
                }
                else
                {
                }
            })
            self.img_CollectionL.reloadData()

        }
    }
    }
}