iOS 8 PhotoKit。 从iCloud照片共享相册中获取最大尺寸的图像

如何从iСloud获取全尺寸图像? 每次我试图得到这张照片,我得到图像大小256×342。 我也看不到进展。

码:

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

直到我点击照片应用程序中的图片,这张照片将是质量差。 但是,只要我点击图片,它下载的设备上,将是全尺寸的质量。

我认为下面应该得到全分辨率的图像数据:

  [manager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { UIImage *image = [UIImage imageWithData:imageData]; //... }]; 

WWDCvideo中涵盖了整个Photos Framework(PhotoKit): https : //developer.apple.com/videos/wwdc/2014/#511

希望这可以帮助。

编辑:

resultHandler可以被调用两次。 我在30点左右链接到的video中对此进行了解释。 可能是因为你只是得到了缩略图,而且第二次被调用的时候,整个图像才会出现。

我有一些相同的问题。 这是一个错误或文档不佳。 我已经能够通过指定2000×2000的请求大小来解决这个问题。 这个问题是,我得到全尺寸的图像,但有时它会回来标记为退化,所以我一直在等待一个不会发生的不同的形象。 这是我所做的解决这些问题。

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

要获得全尺寸的图像,你需要检查信息列表。 我用这个来testing返回的结果是完整的图像还是降级版本。

 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

我相信这与你设置PHImageRequestOptionsDeliveryModeOpportunistic有关。 请注意,这甚至不支持asynchronous模式(默认)。 尝试PHImageRequestOptionsDeliveryModeHighQualityFormat intead。