IOS 8 PhotoKit. Получите максимальное изображение из альбомов iCloud Photo Sharing
Как получить доступ к полноразмерным изображениям iCloud? Каждый раз, когда я пытаюсь получить эту фотографию, я получаю размер изображения 256x342. Я тоже не вижу прогресса.
код:
PHFetchResult *result = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetIdentifier] options:nil];
PHImageManager *manager = [PHImageManager defaultManager];
[result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.synchronous = YES;
options.networkAccessAllowed = YES;
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) {
NSLog(@"%f", progress);
};
[manager requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage *resultImage, NSDictionary *info)
{
UIImage *image = resultImage;
NSLog(@"%@", NSStringFromCGSize(resultImage.size));
}];
}];
Пока я не нажму на картинку в приложении "Фото", это изображение будет низкого качества. Но как только я нажимаю на изображение, он загружается на устройство и будет полноразмерного качества.
Ответы
Ответ 1
Я думаю, что ниже должны получить данные полного разрешения:
[manager requestImageDataForAsset:asset
options:options
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info)
{
UIImage *image = [UIImage imageWithData:imageData];
//...
}];
Вся фотография Framework (PhotoKit) включена в видео WWDC: https://developer.apple.com/videos/wwdc/2014/#511
Надеюсь, что это поможет.
Edit:
РезультатHandler можно вызвать дважды. Это объясняется в видео, к которому я подключился примерно в 30:00. Возможно, вы получаете только миниатюру, и полное изображение будет появляться со вторым его вызовом.
Ответ 2
У меня есть одни и те же проблемы. Это либо ошибка, либо плохая документация. Я смог обойти проблему, указав требуемый размер 2000x2000. Проблема заключается в том, что я получаю полноразмерное изображение, но иногда он возвращается, как деградированный, поэтому я жду следующего изображения, которое никогда не произойдет. Это то, что я делаю, чтобы обойти эти проблемы.
self.selectedAsset = asset;
self.collectionView.allowsSelection = NO;
PHImageRequestOptions* options = [[[PHImageRequestOptions alloc] init] autorelease];
options.synchronous = NO;
options.version = PHImageRequestOptionsVersionCurrent;
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
options.resizeMode = PHImageRequestOptionsResizeModeNone;
options.networkAccessAllowed = YES;
options.progressHandler = ^(double progress,NSError *error,BOOL* stop, NSDictionary* dict) {
NSLog(@"progress %lf",progress); //never gets called
};
[self.delegate choosePhotoCollectionVCIsGettingPhoto:YES]; //show activity indicator
__block BOOL isStillLookingForPhoto = YES;
currentImageRequestId = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(2000, 2000) contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *result, NSDictionary *info) {
NSLog(@"result size:%@",NSStringFromCGSize(result.size));
BOOL isRealDealForSure = NO;
NSNumber* n = info[@"PHImageResultIsPlaceholderKey"]; //undocumented key so I don't count on it
if (n != nil && [n boolValue] == NO){
isRealDealForSure = YES;
}
if([info[PHImageResultIsInCloudKey] boolValue]){
NSLog(@"image is in the cloud"); //never seen this. (because I allowed network access)
}
else if([info[PHImageResultIsDegradedKey] boolValue] && !isRealDealForSure){
//do something with the small image...but keep waiting
[self.delegate choosePhotoCollectionVCPreviewSmallPhoto:result];
self.collectionView.allowsSelection = YES;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ //random time of 3 seconds to get the full resolution in case the degraded key is lying to me. The user can move on but we will keep waiting.
if(isStillLookingForPhoto){
self.selectedImage = result;
[self.delegate choosePhotoCollectionVCPreviewFullPhoto:self.selectedImage]; //remove activity indicator and let the user move on
}
});
}
else {
//do something with the full result and get rid of activity indicator.
if(asset == self.selectedAsset){
isStillLookingForPhoto = NO;
self.selectedImage = result;
[self.delegate choosePhotoCollectionVCPreviewFullPhoto:self.selectedImage];
self.collectionView.allowsSelection = YES;
}
else {
NSLog(@"ignored asset because another was pressed");
}
}
}];
Ответ 3
Чтобы получить полноразмерный образ, вам нужно проверить список информации.
Я использовал это, чтобы проверить, является ли возвращаемый результат полным изображением или ухудшенной версией.
if ([[info valueForKey:@"PHImageResultIsDegradedKey"]integerValue]==0){
// Do something with the FULL SIZED image
} else {
// Do something with the regraded image
}
или вы можете использовать это, чтобы проверить, не вернули ли вы то, что вы просили.
if ([[info valueForKey:@"PHImageResultWantedImageFormatKey"]integerValue]==[[info valueForKey:@"PHImageResultDeliveredImageFormatKey"]integerValue]){
// Do something with the FULL SIZED image
} else {
// Do something with the regraded image
}
Существует ряд других недокументированных, но полезных ключей, например.
PHImageFileOrientationKey = 3;
PHImageFileSandboxExtensionTokenKey = "/private/var/mobile/Media/DCIM/100APPLE/IMG_0780.JPG";
PHImageFileURLKey = "file:///var/mobile/Media/DCIM/100APPLE/IMG_0780.JPG";
PHImageFileUTIKey = "public.jpeg";
PHImageResultDeliveredImageFormatKey = 9999;
PHImageResultIsDegradedKey = 0;
PHImageResultIsInCloudKey = 0;
PHImageResultIsPlaceholderKey = 0;
PHImageResultRequestIDKey = 1;
PHImageResultWantedImageFormatKey = 9999;
Получайте удовольствие.
Linasses
Ответ 4
Я считаю, что это связано с установкой PHImageRequestOptionsDeliveryModeOpportunistic.
Обратите внимание, что это не поддерживается даже для асинхронного режима (по умолчанию).
Попробуйте PHImageRequestOptionsDeliveryModeHighQualityFormat.