web-dev-qa-db-fra.com

Comment convertir PHAsset en UIImage en Objective-C

J'ai un tableau rempli d'objets PHAsset ( https://developer.Apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAsset_Class/index.html ) et je veux savoir comment je peux convertissez-les en UIImage, puis enregistrez-les dans un tableau. 

Le tableau avec les objets PHAsset s'appelle self.assets et voici ce que j'ai jusqu'à présent:

PHImageManager *manager = [PHImageManager defaultManager];

CGFloat scale = UIScreen.mainScreen.scale;

NSMutableArray *images = [NSMutableArray arrayWithCapacity:[self.assets count]];

for (int i = 0; i < [self.assets count]; i++) {

    CGSize targetSize = CGSizeMake(scale, scale);

    [manager requestImageForAsset:[self.assets objectAtIndex:i]
                       targetSize:targetSize
                      contentMode:PHImageContentModeAspectFill
                          options:self.requestOptions
                    resultHandler:^(UIImage *image, NSDictionary *info){
                        [images addObject:image];
                    }];
}

self.requestOptions est une propriété en .h

@property (nonatomic, strong) PHImageRequestOptions *requestOptions;

et dans le viewDidLoad je fais ceci:

self.requestOptions = [[PHImageRequestOptions alloc] init];
self.requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

Mais après avoir fait du débogage, je continue à voir que self.assets a les valeurs suivantes:

(
<PHAsset: 0x1743828a0> 3B6D658D-EC76-43A1-9793-35D889E9CF15/L0/001 mediaType=1/0, assetSource=3, (2448x2448), creationDate=2015-07-27 02:02:46 +0000, location=1, hidden=0, favorite=0 ,
<PHAsset: 0x174382970> 50F05575-71D2-446B-BD1E-8E3250E375AD/L0/001 mediaType=1/0, assetSource=3, (2448x2448), creationDate=2015-07-27 02:02:47 +0000, location=1, hidden=0, favorite=0 
)

et images est vide. Est-ce que quelqu'un sait comment ajouter des PHAssets en UIImages et les ajouter au tableau images? Toute aide est appréciée. Merci!

13
Shalin Shah

Pour ceux qui luttent autant que moi sur cette question, c'est la voie à suivre.

Commencez par définir les requestOptions comme suit:

self.requestOptions = [[PHImageRequestOptions alloc] init];
self.requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

// this one is key
self.requestOptions.synchronous = YES;

et s'il y a plusieurs actifs dans un tableau rempli d'objets PHAsset, ajoutez ce code:

self.assets = [NSMutableArray arrayWithArray:assets];
PHImageManager *manager = [PHImageManager defaultManager];
NSMutableArray *images = [NSMutableArray arrayWithCapacity:[assets count]];

// assets contains PHAsset objects.
 __block UIImage *ima;

for (PHAsset *asset in self.assets) {
    // Do something with the asset

    [manager requestImageForAsset:asset
                       targetSize:PHImageManagerMaximumSize
                      contentMode:PHImageContentModeDefault
                          options:self.requestOptions
                    resultHandler:^void(UIImage *image, NSDictionary *info) {
                        ima = image;

                        [images addObject:ima];
                    }];


}

et maintenant le tableau images contient toutes les images au format uiimage.

39
Shalin Shah

Swift 4.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 
0
ZAFAR007

l'image peut être nulle (rarement). Il est préférable d’évaluer, sinon rien ne sera ajouté dans l’application.

if(image){
    ima = image;
    [images addObject:ima];
}
0
YI-KUN Chiang

Réponse rapide de Swift 3.0

let photoAsset = asset
        let manager = PHImageManager.default()
        var options: PHImageRequestOptions?
        options = PHImageRequestOptions()
        options?.resizeMode = .exact
        options?.isSynchronous = true
        manager.requestImage(
            for: photoAsset,
            targetSize: PHImageManagerMaximumSize,
            contentMode: .aspectFill,
            options: options
        ) { [weak self] result, _ in
            completion(result)
        }

options? .isSynchronous = true est très important

BOOL synchronous; // return only a single result, blocking until available (or failure). Defaults to NO
0
Muhammad Nayab