iOS 8 PhotoKit. Get maximum-size image from iCloud Photo Sharing albums

前端 未结 4 1936
陌清茗
陌清茗 2020-12-13 11:04

How get access to the full-size images from iСloud? Every time I try to get this picture, I get image size 256x342. I not see progress too.

Code:

           


        
相关标签:
4条回答
  • 2020-12-13 11:17

    I believe it's related to you setting PHImageRequestOptionsDeliveryModeOpportunistic. Note that this is not even supported for asynchronous mode (default). Try PHImageRequestOptionsDeliveryModeHighQualityFormat intead.

    0 讨论(0)
  • 2020-12-13 11:26

    I'm having some of the same issues. It is either a bug or poor documentation. I've been able to get around the issue by specifying a requested size of 2000x2000. The problem with this is that I do get the full size image but sometimes it comes back marked as degraded so I keep waiting for a different image which never happens. This is what I do to get around those issues.

            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");
                    }
                }
            }];
    
    0 讨论(0)
  • 2020-12-13 11:33

    I think the below should get the full resolution image data:

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

    The entire Photos Framework (PhotoKit) is covered in the WWDC video: https://developer.apple.com/videos/wwdc/2014/#511

    Hope this helps.

    Edit:

    The resultHandler can be called twice. This is explained in the video I linked to at around 30:00. Could be that you are only getting the thumbnail and the full image will come with the second time its called.

    0 讨论(0)
  • 2020-12-13 11:38

    To get the full size image you need to check the info list. I used this to test if the returned result is the full image, or a degraded version.

    if ([[info valueForKey:@"PHImageResultIsDegradedKey"]integerValue]==0){
        // Do something with the FULL SIZED image
    } else {
        // Do something with the regraded image
    }
    

    or you could use this to check if you got back what you asked for.

    if ([[info valueForKey:@"PHImageResultWantedImageFormatKey"]integerValue]==[[info valueForKey:@"PHImageResultDeliveredImageFormatKey"]integerValue]){
        // Do something with the FULL SIZED image
    } else {
        // Do something with the regraded image
    }
    

    There are a number of other, undocumented but useful, keys e.g.

    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;
    

    Have fun. Linasses

    0 讨论(0)
提交回复
热议问题