2012-01-07 11 views
9

Ho un'app per iPad che riprende immagini dall'applicazione Foto utilizzando ALAssetsLibrary e quindi le carica sul server web. Finora tutto funziona bene.Accesso alle immagini ritagliate o modificate utilizzando ALAssetsLibrary

Ora se si passa all'applicazione delle foto e si modifica un'immagine (ad esempio il ritaglio) e si carica, l'originale non ritagliata viene caricata. Sto accedendo/salvando una foto utilizzando l'url dell'asset.

Es:

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

Questo non è un problema di cache ALAssetsLibrary taormina, ho provato la modifica, uccidere app, avviare, caricati che carica ancora vecchia immagine.

Domanda:

  1. Come faccio a sapere se una (enhanced ritagliata/Red Eye /) la versione modificata della foto è disponibile?
  2. Come accedere alla versione modificata della foto?

risposta

4

Ho riconosciuto lo stesso comportamento e ho fatto alcuni test un po 'di tempo fa. Permettetemi di condividere i miei risultati con voi:

  1. L'immagine modificata si ottiene solo attraverso il metodo fullScreenImage. Questo è anche menzionato nella documentazione di Apple: "In iOS 5 e versioni successive, questo metodo restituisce un'immagine completamente ritagliata, ruotata e regolata, esattamente come un utente vedrebbe in Foto o nel selettore di immagini."

  2. Il metodo fullResolutionImage e getBytes restituiscono l'immagine non modificata. Tuttavia, i parametri di modifica come il ritaglio vengono salvati nei metadati dell'immagine. Queste informazioni sui metadati sono tuttavia interpretate solo da app Apple come Aperture e iPhoto.

  3. È possibile scoprire se un'immagine è stata modificata controllando i metadati dell'immagine. Confronta i metadati di un'immagine non modificata e modificata e cerca le differenze nei campi dei metadati.

+0

Ho stampato la larghezza e l'altezza del CGImageRef ' fullResolutionImage: 3968 x 2232 fullScreenImage: 841 x 1024 ' Purtroppo la fullScreenImage è molto più piccolo l'immagine a schermo intero di. Mi serve l'immagine modificata di dimensioni complete da caricare. C'è un modo alternativo per accedere all'immagine a piena risoluzione modificata. – mithuntnt

+2

Purtroppo non ci sono API per le app di terze parti. – 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; 
} 

In funzione di cui sopra passano valore ALAsset allora l'immagine modificata ... :)

Sopra il codice per ottenere un'immagine modificata dai dati Meta

Se decidete di andare con l'immagine a schermo intero avrai anche l'immagine modificata

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