【问题标题】:Loading image from gallery by local URL (Swift)通过本地 URL (Swift) 从图库中加载图像
【发布时间】:2017-06-22 09:59:49
【问题描述】:

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

一个 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 的字符串都是相同的!

【问题讨论】:

  • 您是否尝试过使用断点并逐步查看它产生意外结果的地方?
  • Class A: url_a -> string_a -> data -> image,但是 Class B: string_a -> data -> nil,这是意外行为。

标签: ios swift image nsurl phasset


【解决方案1】:

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 url 加载图像。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 2014-08-05
      相关资源
      最近更新 更多