web-dev-qa-db-ja.com

iOS 8PhotoKit。 iCloud写真共有アルバムから最大サイズの画像を取得する

IСloudからフルサイズの画像にアクセスするにはどうすればよいですか?この画像を取得しようとするたびに、画像サイズは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));
         }];
    }];

写真アプリで画像をクリックするまで、この画像の品質は低くなります。しかし、私が写真をクリックするとすぐに、それはデバイスにダウンロードされ、フルサイズの品質になります。

15
Mikhail S

以下はフル解像度の画像データを取得する必要があると思います。

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

                  //...

             }];

フォトフレームワーク(PhotoKit)全体がWWDCビデオでカバーされています: https://developer.Apple.com/videos/wwdc/2014/#511

お役に立てれば。

編集:

ResultHandlerは2回呼び出すことができます。これは私が30時頃にリンクしたビデオで説明されています。サムネイルのみを取得していて、2回目に呼び出されたときに完全な画像が表示される可能性があります。

14
dloomb

私は同じ問題のいくつかを抱えています。バグまたは不十分なドキュメントのいずれかです。要求されたサイズを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");
                }
            }
        }];

フルサイズの画像を取得するには、情報リストを確認する必要があります。これを使用して、返された結果が完全なイメージなのか、劣化したバージョンなのかをテストしました。

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;

楽しんで。リナス

1
Linasses

PHImageRequestOptionsDeliveryModeOpportunisticの設定に関連していると思います。これは非同期モード(デフォルト)でもサポートされていないことに注意してください。 PHImageRequestOptionsDeliveryModeHighQualityFormatをお試しください。

0
xaphod