2013-10-30 15 views
5

Sto creando un'applicazione di fotoritocco e fino ad ora sono riuscito a leggere i metadati dai file di immagine con successo (dopo aver ottenuto una risposta a questa domanda : Reading Camera data from EXIF while opening NSImage on OS X).Scrittura di metadati immagine (EXIF/TIFF/IPTC) in file immagine in OS X

source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL); 
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL); 

Copia tutti i metadati del file immagine in un dizionario e funziona correttamente. Tuttavia, non sono riuscito a scoprire come scrivere questi metadati su un nuovo NSImage (o su un file immagine). Ecco come li risparmio mio file (dove img è un'istanza NSImage senza metadati e self.cachedMetadata è il dizionario letta da l'immagine iniziale):

NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]]; 
[rep setProperty:NSImageEXIFData withValue:self.cachedMetadata]; 
NSData *data; 
if([[fileName lowercaseString] rangeOfString:@".png"].location != NSNotFound){ 
    data = [rep representationUsingType:NSPNGFileType properties:nil]; 
}else if([[fileName lowercaseString] rangeOfString:@".tif"].location != NSNotFound){ 
    data = [rep representationUsingType:NSTIFFFileType properties:nil]; 
}else{ //assume jpeg 
    data = [rep representationUsingType:NSJPEGFileType properties:@{NSImageCompressionFactor: [NSNumber numberWithFloat:1], NSImageEXIFData: self.cachedMetadata}]; 
} 

[data writeToFile:fileName atomically:YES]; 

Come posso scrivere i metadati? Scrivevo solo EXIF ​​per JPEG (il dizionario era EXIF-solo in precedenza) con successo ma poiché EXIF ​​mancava di alcuni campi che le immagini iniziali avevano (tag IPTC e TIFF) avevo bisogno di cambiare il mio metodo di lettura. Ora ho tutti i dati, ma non so come scriverlo sul file immagine appena creato.

Grazie, Can.

+0

ciao! Sono più o meno nella stessa situazione ma non riesco a capire la tua soluzione. Ho un elenco di parole chiave, titoli e descrizione che devo scrivere nella sezione IPTC di un jpg che conosco il percorso di. Come si può fare? potresti per favore dare un'occhiata a questa domanda e magari postare una risposta? http://stackoverflow.com/questions/23874865/write-iptc-data-to-file – user2452250

risposta

4

trovato una risposta da un'altra domanda StackOverflow: How do you overwrite image metadata?:

(codice preso da quella domanda stessa e modificato per le mie esigenze, che contiene la risposta alla mia domanda)

//assuming I've already loaded the image source and read the meta 
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) data, NULL); 
CFStringRef imageType = CGImageSourceGetType(source); 

//new empty data to write the final image data to 
NSMutableData *resultData = [NSMutableData data]; 
CGImageDestinationRef imgDest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)(resultData), imageType, 1, NULL); 

//copy image data 
CGImageDestinationAddImageFromSource(imgDest, source, 0, (__bridge CFDictionaryRef)(window.cachedMetadata)); 
BOOL success = CGImageDestinationFinalize(imgDest); 

Questo ha funzionato perfettamente per riscrivere tutti i metadati inclusi EXIF, TIFF e IPTC.

+0

mantiene anche il tracciato di ritaglio se presente? – sharkyenergy

+0

@sharkyenergy a dire il vero non l'ho provato. –

+0

Ho aperto una nuova domanda per questo qui: http://stackoverflow.com/questions/32160528/read-non-standard-properties-from-an-image-in-objective-c aggiungerà Bounty più tardi stasera. Potrebbe essere interessante anche per te se hai un software per il fotoritocco. – sharkyenergy

0

Si potrebbe provare a utilizzare, o guardando il codice in, lo strumento "exiv2" forse.

+0

Ho un progetto commerciale e la licenza commerciale richiede il contatto con il creatore. Farei meglio ad attenermi alle soluzioni integrate. C'è un modo per estrarre completamente tutti i dati, deve anche esserci un modo per riscrivere tutti quei dati nell'immagine. –