2015-07-28 9 views
11

Ich habe ein Array mit PHAsset Objekte gefüllt (https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAsset_Class/index.html), und ich möchte wissen, wie ich sie in eine UIImage konvertieren und dann in einem Array speichern kann.Wie konvertiert man PHAsset zu UIImage in Objective-C

Das Array mit den PHAsset Objekten self.assets genannt und hier ist das, was ich bisher habe:

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 eine Eigenschaft im .h ist

@property (nonatomic, strong) PHImageRequestOptions *requestOptions; 

und in der viewDidLoad Ich mache das:

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

Aber nach ein paar Debugging, behalte ich zu sehen, dass self.assets folgende Werte hat:

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

und images ist leer. Weiß jemand, wie ich die PHAssets in UIImages umwandeln und sie dem images Array hinzufügen kann? Jede Hilfe wird geschätzt. Vielen Dank!

Antwort

34

Für jeden, der so viel wie ich zu diesem Thema zu kämpfen hat, ist dies der Weg zu gehen.

Sie zunächst die requestOptions als:

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

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

und wenn es mit PHAsset Objekte mehrerer Assets in einem Array gefüllt sind, dann diesen Code hinzu:

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


} 

und jetzt die images Array enthält alle die Bilder in uiimage Format.

+2

Dieser Code funktioniert nicht! UIImage * Bild, das über resultHandler zurückgegeben wird, ist immer Null. –

+0

Geben Sie diesem Mann einen Keks. requestOptions.synchronous = JA; Dies hat meinen mysteriösen Fehler beim Anfordern eines Assets behoben. '[Generic] Das Erstellen eines Bildformats mit unbekanntem Typ ist ein Fehler – Billy

0

Swift 3.0 Antwort

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

Optionen? .isSynchronous = true ist sehr wichtig

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

Bild (selten) gleich Null sein kann. Es ist besser zu bewerten, sonst wird die Array-Add-Nil-App zum Absturz gebracht.

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