2015-07-28 14 views
11

Ho una matrice riempita con oggetti PHAsset (https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAsset_Class/index.html) e voglio sapere come posso convertirli in una UIImage e quindi salvarli in una matrice.Come convertire PHAsset in UIImage in Objective-C

L'array con gli oggetti PHAsset è chiamato self.assets ecco cosa ho finora:

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 è una struttura in .h

@property (nonatomic, strong) PHImageRequestOptions *requestOptions; 

e nel viewDidLoad Sto facendo questo:

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

Ma dopo aver eseguito il debug, continuo a visto che self.assets ha i seguenti valori:

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

e images è vuoto. Qualcuno sa come posso convertire i PHAssets in UIImages e aggiungerli alla matrice images? Qualsiasi aiuto è apprezzato. Grazie!

risposta

34

Per chi ha difficoltà a risolvere il problema, questa è la strada da percorrere.

prima impostare l'requestOptions come:

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

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

e se ci sono più risorse in un array piena di oggetti PHAsset, quindi aggiungere questo codice:

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


} 

e ora l'array images contiene tutte le immagini nel formato uiimage.

+2

Questo codice non funziona! L'immagine UIImage * che viene restituita tramite resultHandler è sempre nullo. –

+0

Dai a quest'uomo un biscotto. requestOptions.synchronous = YES; Questo ha risolto il mio misterioso errore durante la richiesta di un bene. '[Generico] La creazione di un formato immagine con un tipo sconosciuto è un errore' – Billy

0

Swift 3.0 risposta

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

opzioni? .isSynchronous = true è molto importante immagine

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

può essere pari a zero (di rado). È meglio valutare, altrimenti l'array add nil andrà in crash.

if(image){ 
    ima = image; 
    [images addObject:ima]; 
}