PHAsset à UIImage

J’essaie de créer un UIImage (comme une vignette ou autre) à partir d’un PHAsset pour pouvoir le transmettre à un UIImage. J’ai essayé d’adapter les solutions que j’ai trouvées sur SO (puisqu’elles ne font que passer directement dans une table, par exemple), mais je n’ai aucun succès (probablement parce que je ne le fais pas correctement).

func getAssetThumbnail(asset: PHAsset) -> UIImage { 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(retimage) return retimage } 

Les imprimeurs me disent que la ligne manager.request ne fait rien pour le moment. Comment puis-je le faire pour me donner le bien en tant qu’UIImage.

Merci.

Cela a fait ce que j’avais besoin de faire, au cas où quelqu’un aurait besoin de ça.

 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 mise à jour

 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 } 

essayez ceci cela fonctionne pour moi, j’espère que cela vous aidera aussi,

 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 } 

Pour Swift 3.0.1:

 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 } 

Ressource: https://gist.github.com/lvterry/f062cf9ae13bca76b0c6#file-getassetthumbnail-swift

Je suggère d’utiliser le PHCachingImageManager d’Apple (qui hérite de PHImageManager):

Un object PHCachingImageManager extrait ou génère des données d’image pour des actifs photo ou vidéo

De plus, PHCachingImageManager prend en charge un meilleur mécanisme de mise en cache.

Exemple de récupération d’une miniature synchrone:

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

De plus, vous pouvez utiliser PHCachingImageManager pour mettre vos images en cache pour une réponse plus rapide de l’interface utilisateur:

Pour utiliser un gestionnaire d’images en cache:

  1. Créez une instance PHCachingImageManager. (Cette étape remplace l’utilisation de l’instance partagée PHImageManager.)

  2. Utilisez les méthodes de classe PHAsset pour récupérer les ressources qui vous intéressent.

  3. Pour préparer des images pour ces actifs, appelez la méthode startCachingImagesForAssets: targetSize: contentMode: options: avec la taille cible, le mode de contenu et les options que vous prévoyez d’utiliser lors de la demande ultérieure d’images pour chaque ressource individuelle.

  4. Lorsque vous avez besoin d’une image pour un actif individuel, appelez la méthode requestImageForAsset: targetSize: contentMode: options: resultHandler: et transmettez les mêmes parameters que lors de la préparation de cet actif.

Si l’image que vous demandez figure parmi celles déjà préparées, l’object PHCachingImageManager renvoie immédiatement cette image. Sinon, Photos prépare l’image à la demande et la met en cache pour une utilisation ultérieure.

Dans notre exemple:

 var phAssetArray : [PHAsset] = [] for i in 0.. 

Le problème est que requestImageForAsset est un resultHandler et ce bloc de code se produit dans le futur après que vos fonctions aient déjà imprimé et renvoyé la valeur attendue. Je suis venu apporter des changements pour vous montrer cela et proposer des solutions simples.

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

En savoir plus sur les fermetures et les manettes d'achèvement et les fonctions asynchrones sur la documentation Apple

J'espère que cela vous aide!

Swift 4.

resizeMode , deliveryMode – Ces parameters peuvent être définis en fonction des besoins de l’utilisateur.

isNetworkAccessAllowedisNetworkAccessAllowed cette isNetworkAccessAllowed sur “true” pour récupérer des images à partir du cloud

imageSize – taille de l’image requirejse

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

Version objective du code basée sur la réponse de 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; }