2014-09-15 2 views
15

Как получить доступ к полноразмерным изображениям iCloud? Каждый раз, когда я пытаюсь получить эту фотографию, я получаю размер изображения 256x342. Я тоже не вижу прогресса.iOS 8 PhotoKit. Получите максимальное изображение из альбомов iCloud Photo Sharing

Код:

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

Пока я не щелкните на фотографию в приложении Photo, эта картина будет низкого качества. Но как только я нажимаю на картинку, она загружается на устройство и будет иметь полноразмерное качество.

+0

В ответ на ваш вопрос о том, почему прогресс не обновляется, вам необходимо отправить в основную очередь обработчика выполнения. Я подал заявку BR, и Apple недавно исправила их SamplePhotosApp, чтобы сделать именно это. – Joey

+0

У меня возникла проблема с альбомами, синхронизированными с iPhoto/Photos на моем Mac. Независимо от того, что я делаю, разрешение указанных фотографий составляет всего 256x342 :( –

ответ

14

Я думаю, что ниже, должен получить данные разрешения изображения полных:

[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:

ResultHandler можно назвать дважды. Это объясняется в видео, к которому я подключился примерно в 30:00. Возможно, вы только получаете эскиз, и полное изображение будет приходить со вторым его вызовом.

+0

Нет, по-прежнему см. размер {256, 342} ориентация 0 шкала 1.000000 –

+0

То же самое здесь. Я также попробовал маршрут requestContentInputEditingWithOptions, указав networkAccessAllowed.Он всегда дает мне версию с низким разрешением уже на моем устройстве, если только я не перейду вручную для предварительного просмотра изображения в Фото. Похоже на ошибку, но я был бы счастлив, если бы ошибался. – cwilper

+0

РезультатHandler можно вызвать дважды. Это объясняется в видео, к которому я подключился примерно в 30:00. Возможно, вы только получаете эскиз, и полное изображение будет приходить со вторым его вызовом. – dloomb

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

какие-либо новости по этому поводу? Все еще есть проблема, и, похоже, это происходит только с фотографиями из PhotoStreams, а не с обычными альбомами iCloud Photo Library. – Thyraz

0

Я считаю, что это связано с установкой вы PHImageRequestOptionsDeliveryModeOpportunistic. Обратите внимание, что это не поддерживается даже в асинхронном режиме (по умолчанию). Попробуйте PHImageRequestOptionsDeliveryModeHighQualityFormat intead.

1

Чтобы получить изображение в полном размере, вы должны проверить информационный список. Я использовал это, чтобы проверить, является ли возвращаемый результат полным изображением или ухудшенной версией.

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

Смежные вопросы