Как преобразовать PHAsset в UIImage в Objective-C
У меня есть массив, заполненный объектами PHAsset
(https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/PHAsset_Class/index.html), и я хочу знать, как я могу преобразовать их в UIImage, а затем сохраните их в массиве.
Массив с объектами 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
? Любая помощь приветствуется. Спасибо!
Ответы
Ответ 1
Для тех, кто изо всех сил пытается справиться с этой проблемой, это путь.
Сначала установите 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
Отчет 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 = true очень важны
BOOL synchronous; // return only a single result, blocking until available (or failure). Defaults to NO
Ответ 3
Изображение может быть ноль (редко). Это лучше оценить, иначе массив добавит nil приведет к сбою приложения.
if(image){
ima = image;
[images addObject:ima];
}