Swift 相位设置为UIImage

Swift 相位设置为UIImage,swift,phasset,Swift,Phasset,我试图从一个相集创建一个UIImage(比如缩略图或其他东西),这样我就可以将它传递到一个获取UIImage的东西中。我已经尝试过调整我在SO上找到的解决方案(因为它们都只是直接将其传递到tableview或其他东西中),但没有成功(可能是因为我做得不对) 打印人员告诉我manager.request行现在没有做任何事情。如何让它将资产作为UIImage提供给我 谢谢。问题在于requestImageForAsset是一个resultHandler,这段代码将在函数打印并返回预期值后发生。我来这

我试图从一个相集创建一个UIImage(比如缩略图或其他东西),这样我就可以将它传递到一个获取UIImage的东西中。我已经尝试过调整我在SO上找到的解决方案(因为它们都只是直接将其传递到tableview或其他东西中),但没有成功(可能是因为我做得不对)

打印人员告诉我manager.request行现在没有做任何事情。如何让它将资产作为UIImage提供给我


谢谢。

问题在于requestImageForAsset是一个resultHandler,这段代码将在函数打印并返回预期值后发生。我来这里是为了向你们展示这种情况,并提出一些简单的解决方案

func getAssetThumbnail(asset: PHAsset) {
    var retimage = UIImage()
    println(retimage)
    let manager = PHImageManager.defaultManager()
    manager.requestImageForAsset(asset, targetSize: CGSize(width: 100.0, height: 100.0), contentMode: .AspectFit, options: nil, resultHandler: {
    (result, info)->Void in
            retimage = result
      println("This happens after")
      println(retimage)
      callReturnImage(retimage) // <- create this method
    })
    println("This happens before")
}
func getAssetThumbnail(资产:PHAsset){
var retimage=UIImage()
println(重成像)
let manager=PHImageManager.defaultManager()
manager.requestImageForAsset(资产,targetSize:CGSize(宽度:100.0,高度:100.0),contentMode:.AspectFit,选项:nil,resultHandler:{
(结果,信息)->在中无效
重成像=结果
println(“这发生在之后”)
println(重成像)

callReturnImage(retimage)//这就是我需要它做的,以防任何人也需要它

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
}
编辑:Swift 3更新 我建议使用苹果的(继承自PHImageManager):

PHCachingImageManager对象为照片或视频资产获取或生成图像数据

另外,phcachingimanager支持更好的缓存机制

获取缩略图的示例:

let options = PHImageRequestOptions()
options.deliveryMode = .HighQualityFormat
options.synchronous = true // Set it to false for async callback

let imageManager = PHCachingImageManager()
imageManager.requestImageForAsset(YourPHAssetVar,
                                  targetSize: CGSizeMake(CGFloat(160), CGFloat(160)),
                                  contentMode: .AspectFill,
                                  options: options,
                                  resultHandler: { (resultThumbnail : UIImage?, info : [NSObject : AnyObject]?) in

                                                   // Assign your thumbnail which is the *resultThumbnail*
                                                  }
此外,您还可以使用PHCachingImageManager来缓存图像,以实现更快的UI响应:

要使用缓存图像管理器,请执行以下操作:

  • 创建PHCachingImageManager实例。(此步骤替换使用 共享的PHImageManager实例。)

  • 使用PHAsset类方法获取您感兴趣的资产

  • 要为这些资产准备图像,请调用 StartChinaGimagesForasets:targetSize:contentMode:options:method 具有目标大小、内容模式和您计划在以下情况下使用的选项: 稍后为每个单独的资产请求图像

  • 当您需要单个资产的图像时,请调用 requestImageForAsset:targetSize:contentMode:options:resultHandler: 方法,并传递准备时使用的相同参数 资产

  • 如果您请求的图像是已经准备好的图像,则 PHCachingImageManager对象立即返回该图像。 否则,照片会按需准备图像并将其缓存以备以后使用 使用

    在我们的例子中:

    var phAssetArray : [PHAsset] = []
    
    for i in 0..<assets.count
    {
      phAssetArray.append(assets[i] as! PHAsset)
    }
    
    let options = PHImageRequestOptions()
    options.deliveryMode = .Opportunistic
    options.synchronous = false
    
    self.imageManager.startCachingImagesForAssets(phAssetArray,
                                                  targetSize: CGSizeMake(CGFloat(160), CGFloat(160)),
                                                  contentMode: .AspectFill,
                                                  options: options)
    
    var phAssetArray:[PHAsset]=[]
    对于Swift 3.0.1中的i..

    func getAssetThumbnail(asset: PHAsset, size: CGFloat) -> UIImage {
        let retinaScale = UIScreen.main.scale
        let retinaSquare = CGSize(width: size * retinaScale, height: size * retinaScale)//(size * retinaScale, size * retinaScale)
        let cropSizeLength = min(asset.pixelWidth, asset.pixelHeight)
        let square = CGRect(x:0, y: 0,width: CGFloat(cropSizeLength),height: CGFloat(cropSizeLength))
        let cropRect = square.applying(CGAffineTransform(scaleX: 1.0/CGFloat(asset.pixelWidth), y: 1.0/CGFloat(asset.pixelHeight)))
    
        let manager = PHImageManager.default()
        let options = PHImageRequestOptions()
        var thumbnail = UIImage()
    
        options.isSynchronous = true
        options.deliveryMode = .highQualityFormat
        options.resizeMode = .exact
        options.normalizedCropRect = cropRect
    
        manager.requestImage(for: asset, targetSize: retinaSquare, contentMode: .aspectFit, options: options, resultHandler: {(result, info)->Void in
            thumbnail = result!
        })
        return thumbnail
    }
    

    参考资料:

    试试这个,它对我有用,希望它也能帮助你

    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
    }
    

    Objective-c版代码基于dcheng答案

    -(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;
      }
    
    斯威夫特4

    resizeMode
    deliveryMode
    -可根据用户需求进行设置

    isNetworkAccessAllowed
    -将此设置为“true”以从云中获取图像

    imageSize
    -所需的图像大小

    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!)
        })
    }
    
    简单解决方案(Swift 4.2)

    方法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 
    
    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
    
    如果您只需要从
    PHAsset
    获取
    UIImage
    ,请使用此方法

    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?)
    
    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")
    })
    
    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?)
    
    将此方法用于所需的
    UIImage

    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?)
    
    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")
    })
    
    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?)
    
    使用此方法在完成后通知

    方法2:

    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 
    
    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
    
    如果需要
    UIImage
    PHAsset

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

    对所需数据使用此方法。

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

    仍然有点困惑。所以我们正在更改getAssetThumbnail以不返回任何内容?在这种情况下,我们将如何将重映像传递给我们需要的内容?何时以及如何执行该块以获得有用的内容。希望callReturnImage与我们尝试将重映像传递给的其他函数分开。您不能返回在检索之前,您的返回将发生,请添加另一个函数,该函数可以对图像执行您想要执行的操作,或者在完成块中添加您想要对图像执行的操作。这是解决此问题的两种更简单的方法。对。好吧,假设我有两个函数(x&y)这两个都需要UIImages。我希望它们对我们在该块中创建的UIImages进行操作。我是否不可能在该块之外通过将UIImages传递到x&y并从请求方法获取该图像来完成此操作?或者我必须将x&y作为您暗示的callReturnImage函数。如果不可能,那么如果我是要在将来创建函数z,我不是必须回去编辑这个函数才能工作吗?我不是说这是不可能的,我是说这是一种更简单的方法,你可以创建函数,也可以返回完成块,但问题对你来说只会变得更大,我会在答案中发布一个链接,这样你就可以了解更多le,假设我想这样做:var image=a.getAssetThumbnail(firstAsset)我如何才能做到这一点?如果有人需要更多信息,请查看苹果的示例代码:如何获得相位集的原始宽度+高度?我还想知道如何获得原始宽度和高度,您找到解决方案了吗,@TimNuwin?如果您谈论的是pixelWidth和pixelHeight属性,那么这就是您要使用的。如果不是,我需要更多的信息来帮助。希望这个链接有帮助:你可以通过设置PHImageManagerMaximumSize为targetSize来获取原始图像。@BorutTomazin我似乎遇到了一个奇怪的崩溃,
    这个应用程序在从主线程访问引擎后从后台线程修改自动布局引擎。这可能会导致d导致引擎损坏和奇怪的崩溃。
    当我更改
    targetSize
    时,我收到了错误“