ios objective-c uiimage ios7 alassetslibrary

ios - ALAsset defaultRepresentation fullResolutionImage



objective-c uiimage (1)

Tengo un problema con la nueva característica de filtros de fotos de iOS 7.

Tengo una fotolibrería en mi aplicación. Mientras muestro las miniaturas de fotos en UICollectionView, recibo imágenes con filtros y recortes ya aplicados. Hay dos métodos que devuelven imágenes "listas para usar":

  • [asset thumbnail]
  • [[asset defaultRepresentation] fullScreenImage]

Por el contrario, cuando quiero compartir una imagen a tamaño completo, recibo una foto sin cambios sin ningún filtro:

¿Es posible obtener una imagen de tamaño completo con el filtro apropiado aplicado?


Hasta ahora he descubierto una sola manera de obtener lo que quiero. Todos los activos almacenan su información de modificación (como filtros, cultivos, etc.) en el diccionario de metadatos con la tecla @"AdjustmentXMP" . Podemos interpretar estos datos y aplicar todos los filtros a fullResolutionImage como en esta respuesta SO. Aquí está mi solución completa:

... ALAssetRepresentation *assetRepresentation = [asset defaultRepresentation]; CGImageRef fullResImage = [assetRepresentation fullResolutionImage]; NSString *adjustment = [[assetRepresentation metadata] objectForKey:@"AdjustmentXMP"]; if (adjustment) { NSData *xmpData = [adjustment dataUsingEncoding:NSUTF8StringEncoding]; CIImage *image = [CIImage imageWithCGImage:fullResImage]; NSError *error = nil; NSArray *filterArray = [CIFilter filterArrayFromSerializedXMP:xmpData inputImageExtent:image.extent error:&error]; CIContext *context = [CIContext contextWithOptions:nil]; if (filterArray && !error) { for (CIFilter *filter in filterArray) { [filter setValue:image forKey:kCIInputImageKey]; image = [filter outputImage]; } fullResImage = [context createCGImage:image fromRect:[image extent]]; } } UIImage *result = [UIImage imageWithCGImage:fullResImage scale:[assetRepresentation scale] orientation:(UIImageOrientation)[assetRepresentation orientation]];