2015-07-28 3 views
11

У меня есть массив, заполненный объектами PHAsset (https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAsset_Class/index.html), и я хочу знать, как я могу преобразовать их в UIImage, а затем сохранить их в массиве.Как преобразовать PHAsset в UIImage в Objective-C

массив с объектами PHAsset называется self.assets, и вот что у меня до сих пор:

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 это свойство в .h

@property (nonatomic, strong) PHImageRequestOptions *requestOptions; 

и в viewDidLoad Я делаю это:

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

Но после некоторой отладки, я сохраняю видя, что self.assets имеет следующие значения:

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

и images пуст. Кто-нибудь знает, как я могу добавить преобразование PHAssets в UIImages и добавить их в массив images? Любая помощь приветствуется. Благодаря!

ответ

34

Для тех, кто борется столько, сколько у меня был по этой проблеме, это путь.

Сначала установите requestOptions как:

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

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

и если есть несколько объектов в массиве, заполненном объектами PHAsset, а затем добавить этот код:

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


} 

и теперь images массив содержит все изображения в формате uiimage.

+2

Этот код не работает! Изображение UIImage *, которое возвращается через resultHandler, всегда равно нулю. –

+0

Дайте этому человеку печенье. requestOptions.synchronous = YES; Это фиксировало мою загадочную ошибку при запросе актива. '[Generic] Создание формата изображения с неизвестным типом является ошибкой' – Billy

0

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

варианты? .isSynchronous = истина очень важно

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

изображение может быть нулевым (редко). Лучше оценивать, иначе массив добавит nil приведет к сбою приложения.

if(image){ 
    ima = image; 
    [images addObject:ima]; 
} 
Смежные вопросы