fotos - iOS 8 PhotoKit. Obtenga imágenes de máximo tamaño de álbumes de iCloud Photo Sharing
icloud photo sharing pc (4)
Creo que a continuación debería obtener los datos de imagen de resolución completa:
[manager requestImageDataForAsset:asset
options:options
resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info)
{
UIImage *image = [UIImage imageWithData:imageData];
//...
}];
Todo el Marco de Fotos (PhotoKit) está cubierto en el video de WWDC: https://developer.apple.com/videos/wwdc/2014/#511
Espero que esto ayude.
Editar:
El resultado Handler se puede llamar dos veces. Esto se explica en el video al que me vinculé alrededor de las 30:00. Podría ser que solo consigas la miniatura y la imagen completa vendrá con la segunda vez que se invoque.
¿Cómo obtener acceso a las imágenes de tamaño completo de iСloud? Cada vez que trato de obtener esta imagen, obtengo un tamaño de imagen de 256x342. Yo tampoco veo progreso.
Código:
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));
}];
}];
Hasta que haga clic en la imagen en la aplicación Foto, esta imagen será de mala calidad. Pero tan pronto como haga clic en la imagen, se descargará en el dispositivo y será de gran tamaño.
Creo que está relacionado con la configuración de PHImageRequestOptionsDeliveryModeOpportunistic. Tenga en cuenta que esto ni siquiera es compatible con el modo asincrónico (predeterminado). Pruebe PHImageRequestOptionsDeliveryModeHighQualityFormat intead.
Estoy teniendo algunos de los mismos problemas. Es un error o una documentación deficiente. Pude solucionar el problema especificando un tamaño solicitado de 2000x2000. El problema con esto es que obtengo la imagen a tamaño completo, pero a veces vuelve marcada como degradada, así que sigo esperando una imagen diferente que nunca sucede. Esto es lo que hago para evitar esos problemas.
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");
}
}
}];
Para obtener la imagen a tamaño completo, debe verificar la lista de información. Lo usé para probar si el resultado devuelto es la imagen completa o una versión degradada.
if ([[info valueForKey:@"PHImageResultIsDegradedKey"]integerValue]==0){
// Do something with the FULL SIZED image
} else {
// Do something with the regraded image
}
o puede usar esto para verificar si recibió lo que solicitó.
if ([[info valueForKey:@"PHImageResultWantedImageFormatKey"]integerValue]==[[info valueForKey:@"PHImageResultDeliveredImageFormatKey"]integerValue]){
// Do something with the FULL SIZED image
} else {
// Do something with the regraded image
}
Hay varias otras claves, indocumentadas pero útiles, por ejemplo
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;
Que te diviertas. Linasas