在OS X中将图像元数据(EXIF/TIFF/IPTC)写入图像文件

6

我正在创建一个照片编辑应用程序,到目前为止,我已经成功地从图像文件中读取了元数据(在得到这个问题的答案之后:在打开OS X上的NSImage时读取EXIF中的相机数据)。

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

这将图像文件的所有元数据复制到一个字典中,效果还不错。然而,我找不到如何将这些元数据写回到新创建的NSImage(或图像文件)中。以下是我保存文件的方式(其中img是没有元数据的NSImage实例,self.cachedMetadata是从初始图像中读取的字典):

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];

我该如何编写元数据?以前我只为JPEG编写EXIF(字典之前仅为EXIF),并成功地进行了编写,但由于EXIF缺少一些最初图像具有的字段(IPTC和TIFF标签),我需要更改我的读取方法。现在我有了所有数据,但我不知道如何将其写入新创建的图像文件。

谢谢, Can。


你好!我和你处于类似的情况,但是无法理解你的解决方案。我有一个关键词列表、标题和描述,必须将它们写入我知道路径的jpg文件的IPTC部分。这该怎么做?你能否看一下这个问题,然后可能发布一个答案?https://dev59.com/9YDaa4cB1Zd3GeqP_Aua - user2452250
2个回答

4

从另一个StackOverflow问题中找到了答案:如何覆盖图像元数据?

(代码取自该问题并根据我的需要进行修改,其中包含了我问题的答案)

//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);

这对于包括EXIF、TIFF和IPTC在内的所有元数据写回都非常完美。

如果存在剪辑路径,这是否也会保留它? - sharkyenergy
我在这里开了一个新问题:https://dev59.com/To7ea4cB1Zd3GeqPAF17 将在今晚添加赏金。如果你自己有照片编辑软件,这也可能会对你有所帮助。 - sharkyenergy
我在发布的链接中还附有一个带有剪贴路径的样本JPG.. 你能否请看一下?如果有人解决了,我会再给出另一个赏金。目前无法立即开放赏金,因为如果答案在7天内没有得到,它就会消失.. 谢谢。 - sharkyenergy

0
你可以尝试使用或查看 "exiv2" 工具中的代码。

我有一个商业项目,商业许可证要求联系创建者。我最好坚持使用内置解决方案。有一种方法可以完全提取所有数据,也必须有一种方法将所有数据写回图像中。 - Can Poyrazoğlu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接