Работа с изображениями (CGImage), данными exif и значками файлов - PullRequest
3 голосов
/ 20 мая 2010

Что я пытаюсь сделать (до 10.6) ....

У меня есть изображение (jpeg), которое включает значок в файле изображения (то есть вы видите значок, основанный на изображении в файле, в отличие от общего значка jpeg в диалоговых окнах открытия файлов в программе). Я хочу отредактировать метаданные exif, сохранить их обратно в изображение в новом файле. В идеале я хотел бы сохранить его обратно в точную копию файла (т.е. сохранить любые созданные встроенные значки и т. Д.), Однако в моих руках значок потерян.

Мой код (некоторые биты удалены для удобства чтения):

// set up source ref I THINK THE PROBLEM IS HERE - NOT GRABBING THE INITIAL DATA
CGImageSourceRef source = CGImageSourceCreateWithURL( (CFURLRef) URL,NULL);

// snag metadata
NSDictionary *metadata = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source,0,NULL);

// make metadata mutable
NSMutableDictionary *metadataAsMutable = [[metadata mutableCopy] autorelease];

// grab exif
NSMutableDictionary *EXIFDictionary = [[[metadata objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy] autorelease];

<< edit exif >>

// add back edited exif
[metadataAsMutable setObject:EXIFDictionary forKey:(NSString *)kCGImagePropertyExifDictionary];

// get source type
CFStringRef UTI = CGImageSourceGetType(source);

// set up write data
NSMutableData *data = [NSMutableData data];
CGImageDestinationRef destination = CGImageDestinationCreateWithData((CFMutableDataRef)data,UTI,1,NULL);

//add the image plus modified metadata PROBLEM HERE? NOT ADDING THE ICON
CGImageDestinationAddImageFromSource(destination,source,0, (CFDictionaryRef) metadataAsMutable);

// write to data
BOOL success = NO;
success = CGImageDestinationFinalize(destination);

// save data to disk 
[data writeToURL:saveURL atomically:YES];

//cleanup
CFRelease(destination);
CFRelease(source);

Я не знаю, действительно ли это вопрос обработки изображений, обработки файлов, обработки после сохранения (я мог бы использовать sip), или я просто думаю (я подозреваю, что последний).

Ник

1 Ответ

1 голос
/ 20 мая 2010

Разве вы не ненавидите, когда публикуете что-то, а потом находите ответ ...

Чтобы справиться с этим, используйте:

// grab the original unique icon
NSImage *theicon = [[NSWorkspace sharedWorkspace] iconForFile:full_file_path_of_original]];

// add it to the file after you have saved
BOOL done = [[NSWorkspace sharedWorkspace] setIcon:theicon forFile:full_file_path_to_new_file options:NSExcludeQuickDrawElementsIconCreationOption];

Doh!

...