2014-09-15 4 views
15

Wie erhalten Sie Zugriff auf die Bilder in voller Größe von iСloud? Jedes Mal, wenn ich versuche, dieses Bild zu bekommen, bekomme ich die Bildgröße 256x342. Ich sehe auch keinen Fortschritt.iOS 8 PhotoKit. Erhalten Sie maximale Größe Bild von iCloud Photo Sharing Alben

Code:

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

Bis ich das Bild in Foto-App klicken, wird das Bild von schlechter Qualität sein. Aber sobald ich auf das Bild klicke, wird es auf das Gerät heruntergeladen und wird in voller Größe angezeigt.

+0

Als Antwort auf Ihre Frage, warum der Fortschritt nicht aktualisiert wird, müssen Sie im Fortschritts-Handler zur Hauptwarteschlange senden. Ich habe einen BR eingereicht, und Apple hat kürzlich ihre SamplePhotosApp dafür eingerichtet, genau das zu tun. – Joey

+0

Ich habe dieses Problem mit Alben, die von iPhoto/Photos auf meinem Mac synchronisiert wurden. Egal, was ich tue, die Auflösung der Fotos ist nur 256x342 :( –

Antwort

14

ich denke, die unter die Daten Bild mit voller Auflösung erhalten sollen:

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

        //... 

      }]; 

Das gesamte Foto Framework (PhotoKit) abgedeckt in dem WWDC Video: https://developer.apple.com/videos/wwdc/2014/#511

Hoffnung, das hilft.

Edit:

Die resultHandler zweimal aufgerufen werden kann. Dies wird in dem Video erklärt, mit dem ich um ca. 30:00 Uhr verbunden bin. Könnte sein, dass du nur das Thumbnail bekommst und das volle Bild mit dem zweiten Mal kommt, wenn es aufgerufen wird.

+0

Nein, siehe Größe {256, 342} Ausrichtung 0 Maßstab 1.000000 –

+0

Das gleiche hier.Ich habe auch versucht die RequestContentInputEditingWithOptions Route, Angabe networkAccessAllowed.Es gibt mir immer die Low-Res Version schon auf meinem Gerät, es sei denn ich gehe vorher manuell auf das Bild in Photos. Scheint wie ein Käfer, aber ich wäre glücklich, dass ich mich als falsch erwiesen habe. – cwilper

+0

Der resultHandler kann zweimal aufgerufen werden. Dies wird in dem Video erklärt, mit dem ich um ca. 30:00 Uhr verbunden bin. Könnte sein, dass du nur das Thumbnail bekommst und das volle Bild mit dem zweiten Mal kommt, wenn es aufgerufen wird. – dloomb

2

Ich habe einige der gleichen Probleme. Es ist entweder ein Fehler oder eine schlechte Dokumentation. Ich konnte das Problem umgehen, indem ich eine angeforderte Größe von 2000x2000 vorgab. Das Problem dabei ist, dass ich das Bild in voller Größe bekomme, aber manchmal kommt es wieder als "degraded" zurück, also warte ich immer auf ein anderes Bild, was nie passiert. Dies ist, was ich tue, um diese Probleme zu umgehen.

 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

irgendwelche Nachrichten zu diesem? Immer noch das Problem und es scheint nur mit Fotos aus PhotoStreams, nicht normalen iCloud Photo Library Alben zu passieren. – Thyraz

0

Ich glaube, dass es mit Ihnen Einstellung PHImageRequestOptionsDeliveryModeOpportunistic verwandt ist. Beachten Sie, dass dies im asynchronen Modus nicht unterstützt wird (Standard). Versuchen Sie PHImageRequestOptionsDeliveryModeHighQualityFormat intead.

1

Um das Bild in voller Größe zu erhalten, müssen Sie die Informationsliste überprüfen. Ich habe dies verwendet, um zu testen, ob das zurückgegebene Ergebnis das vollständige Bild oder eine verschlechterte Version ist.

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

oder Sie könnten dies verwenden, um zu überprüfen, ob Sie zurückbekommen haben, wonach Sie gefragt haben.

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

Es gibt eine Reihe anderer, undokumentierter aber nützlicher Schlüssel, z.

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; 

Haben Sie Spaß. Linasses