2012-01-07 15 views
9

Tengo una aplicación ipad que toma imágenes de la aplicación Fotos usando ALAssetsLibrary y luego las carga en el servidor web. Hasta ahora todo está funcionando bien.Acceso a las imágenes recortadas o editadas utilizando ALAsLibrary

Ahora, si voy a la aplicación de fotos y edito una imagen (digamos recortar) y la carga, la original sin recortar se sube. Estoy accediendo/guardando una foto usando la url del activo.

Ex:

createPhoto: 
assetUrl: assets-library://asset/asset.JPG?id=542F09CA-00E1-412E-A7E6-0C222E3F8FFB&ext=JPG, 
UTIs: (
    "public.jpeg" 
), 
UTI:public.jpeg 

Esto no es un problema de caché ALAssetsLibrary becuase, he tratado de edición, matar aplicación, iniciar, cargados que todavía sube una imagen antigua.

Pregunta:

  1. ¿Cómo sé si un (/ mejorada recortada/ojos rojos) versión editada de la foto está disponible?
  2. ¿Cómo accedo a la versión editada de la foto?

Respuesta

4

Reconocí el mismo comportamiento e hice algunas pruebas hace un tiempo. Permítanme compartir mis resultados con usted:

  1. La imagen editada solo se obtiene a través del método de pantalla completa. Esto también se menciona en la documentación de Apple: "En iOS 5 y posterior, este método devuelve una imagen completamente recortada, girada y ajustada, exactamente como vería un usuario en Fotos o en el selector de imágenes".

  2. El método fullResolutionImage y getBytes devuelven la imagen sin editar. Sin embargo, los parámetros de edición como crop se guardan en los metadatos de la imagen. Sin embargo, esta información de metadatos solo es interpretada por aplicaciones de Apple como Aperture e iPhoto.

  3. Puede averiguar, si una imagen ha sido editada, inspeccionando los metadatos de la imagen. Compare los metadatos de una imagen editada y sin editar y busque las diferencias en los campos de metadatos.

+0

Imprimí el ancho y la altura de la fullResolutionImage CGImageRef ' : 3968 X 2232 fullScreenImage: 841 x 1024 ' Por desgracia, la fullScreenImage es mucho más pequeña sea la imagen de pantalla completa de. Necesito la imagen editada de tamaño completo para cargar. ¿Hay alguna forma alternativa de acceder a la imagen editada de resolución completa? – mithuntnt

+2

Desafortunadamente, no hay API para aplicaciones de terceros que lo hagan. – holtmann

1
-(UIImage*)fullScreenImage:(ALAsset *)imageAsset{ 
    ALAssetRepresentation *assetRepresentation = [imageAsset 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]]; 
    return result; 
} 

En función de arriba pasan valor ALAsset entonces la imagen editada ... :)

Por encima de código para conseguir imagen editada a partir de datos Meta

Si u ir con la imagen de pantalla completa, entonces también obtendrá la imagen editada

ALAssetRepresentation *representation = [asset defaultRepresentation]; 
CGImageRef iref = [representation fullScreenImage]; 
UIImage *editedImage = [UIImage imageWithCGImage:iref]; 
Cuestiones relacionadas