PHAsset to UIImage

后端 未结 9 2059
不思量自难忘°
不思量自难忘° 2020-12-07 22:23

I\'m attempting to create a UIImage (like a thumbnail or something) from a PHAsset so that I can pass it into something that takes a UIImage. I\'ve tried adapting solutions

相关标签:
9条回答
  • 2020-12-07 22:33

    Objective-c version of code based on dcheng answer.

    -(UIImage *)getAssetThumbnail:(PHAsset * )asset {
    
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
        options.synchronous = true;
    
        __block UIImage *image;
        [PHCachingImageManager.defaultManager requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
            image = result;
        }];
        return image;
      }
    
    0 讨论(0)
  • 2020-12-07 22:42

    Simple Solution (Swift 4.2)

    Method 1:

    extension PHAsset {
    
        var image : UIImage {
            var thumbnail = UIImage()
            let imageManager = PHCachingImageManager()
            imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { image, _ in
                thumbnail = image!
            })
            return thumbnail
        }
    }                          
    
    let image = asset.image 
    

    Use this method if you only need UIImage from PHAsset.

    OR

    extension PHAsset {
        func image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> UIImage {
            var thumbnail = UIImage()
            let imageManager = PHCachingImageManager()
            imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image, _ in
                thumbnail = image!
            })
            return thumbnail
        }
    }
    
    let image = asset.image(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
    

    Use this method for your desired UIImage.

    OR

    extension PHAsset {
    
        func image(completionHandler: @escaping (UIImage) -> ()){
            var thumbnail = UIImage()
            let imageManager = PHCachingImageManager()
            imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { img, _ in
                thumbnail = img!
            })
            completionHandler(thumbnail)
        }
    }
    
    let image = asset.image(completionHandler: {(img) in
        print("Finished")
    })
    

    Use this method for notify after completion.

    Method 2:

    extension PHAsset {
        var data : (UIImage, [AnyHashable : Any]) {
            var img = UIImage(); var information = [AnyHashable : Any](); let imageManager = PHCachingImageManager()
            imageManager.requestImage(for: self, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: nil, resultHandler: { image,info in
                img = image!
                information = info!
            })
            return (img,information)
        }
    } 
    
    
    let image_withData : (UIImage, [AnyHashable : Any]) = asset.data
    

    Use this method if you want UIImage And Result Info of PHAsset

    OR

    extension PHAsset {
    
        func data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?) -> (UIImage, [AnyHashable : Any]) {
            var img = UIImage(); var information = [AnyHashable : Any](); let imageManager = PHCachingImageManager()
            imageManager.requestImage(for: self, targetSize: targetSize, contentMode: contentMode, options: options, resultHandler: { image,info in
                img = image!
                information = info!
            })
            return (img,information)
        }
    }
    
    let data = asset?.data(targetSize: CGSize, contentMode: PHImageContentMode, options: PHImageRequestOptions?)
    

    Use this method for your desired Data.

    0 讨论(0)
  • 2020-12-07 22:44

    This did what I needed it to do, in case anyone also needs this.

    func getAssetThumbnail(asset: PHAsset) -> UIImage {
        let manager = PHImageManager.defaultManager()
        let option = PHImageRequestOptions()
        var thumbnail = UIImage()
        option.synchronous = true
        manager.requestImageForAsset(asset, targetSize: CGSize(width: 100.0, height: 100.0), contentMode: .AspectFit, options: option, resultHandler: {(result, info)->Void in
                thumbnail = result!
        })
        return thumbnail
    }
    

    Edit: Swift 3 update

    func getAssetThumbnail(asset: PHAsset) -> UIImage {
        let manager = PHImageManager.default()
        let option = PHImageRequestOptions()
        var thumbnail = UIImage()
        option.isSynchronous = true
        manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in
            thumbnail = result!
        })
        return thumbnail
    }
    
    0 讨论(0)
  • 2020-12-07 22:45

    Swift 4.

    resizeMode,deliveryMode - These can be set according to user requirement.

    isNetworkAccessAllowed - set this to "true" for fetching images from the cloud

    imageSize- required image size

    func getImageFromAsset(asset:PHAsset,imageSize:CGSize, callback:@escaping (_ result:UIImage) -> Void) -> Void{
    
        let requestOptions = PHImageRequestOptions()
        requestOptions.resizeMode = PHImageRequestOptionsResizeMode.fast
        requestOptions.deliveryMode = PHImageRequestOptionsDeliveryMode.highQualityFormat
        requestOptions.isNetworkAccessAllowed = true
        requestOptions.isSynchronous = true
        PHImageManager.default().requestImage(for: asset, targetSize: imageSize, contentMode: PHImageContentMode.default, options: requestOptions, resultHandler: { (currentImage, info) in
            callback(currentImage!)
        })
    }
    
    0 讨论(0)
  • 2020-12-07 22:47

    try this it works for me, hope it helps you too,

    func getUIImage(asset: PHAsset) -> UIImage? {
    
        var img: UIImage?
        let manager = PHImageManager.default()
        let options = PHImageRequestOptions()
        options.version = .original
        options.isSynchronous = true
        manager.requestImageData(for: asset, options: options) { data, _, _, _ in
    
            if let data = data {
                img = UIImage(data: data)
            }
        }
        return img
    }
    
    0 讨论(0)
  • 2020-12-07 22:47

    Swift 5

    extension PHAsset {
    func getAssetThumbnail() -> UIImage {
        let manager = PHImageManager.default()
        let option = PHImageRequestOptions()
        var thumbnail = UIImage()
        option.isSynchronous = true
        manager.requestImage(for: self,
                             targetSize: CGSize(width: self.pixelWidth, height: self.pixelHeight),
                             contentMode: .aspectFit,
                             options: option,
                             resultHandler: {(result, info) -> Void in
                                thumbnail = result!
                             })
        return thumbnail
        }
    }
    
    0 讨论(0)
提交回复
热议问题