3

我需要获取一个现有的 jpg 文件并修改其 IPTC 条目中的标题、描述和关键字。这里有几个主题,但都没有答案或部分答案。我已经知道如何阅读 IPTC 信息,但需要对其进行编辑。有人可以对这个经过大量研究但鲜为人知的话题有所了解吗?

我所拥有的是:

NSString: title
NSString: description
NSArray: keywords
NSString: path to the file

我想使用现有 IPTC 数据获取现有图像并用这些数据替换现有条目,但保留所有其他 IPTC 条目,例如位置、日期等。到目前为止我所知道的是我需要使用 CGImageDestination。

谢谢

4

2 回答 2

4

您应该首先从文件中读取元数据:

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

在上面的代码中,url是您的图像文件的 URL。props将在目标 URL 处包含图像的所有元数据。

然后,将该数据复制到一个新的可变空数据源:

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

最后,假设您在一个新NSDictionary实例(modifiedMetadata在本例中调用)中修改了元数据:

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

这会将元数据写入目标图像。至少在我的情况下,它工作得很好。

要将图像数据保存到实际文件中,可以定期写入数据,例如:

[resultData writeToFile:fileName atomically:YES];
于 2014-05-26T18:29:02.040 回答
3

您应该使用 XMP Toolkit SDK,您可以在adobe SDK 页面找到详细信息, 实现有点棘手,但是一旦您将静态库添加到项目中,您就可以读取和写入 XMP 信息,它涵盖了 IPTC 命名空间以及其他命名空间,如都柏林-核心等

像这样将库添加到项目代码之后。

#include "XMP.incl_cpp"
#include "XMP.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>

-(void)readIPTC
{
    SXMPMeta::Initialize()
    SXMPMeta imageMeta;

    if(imageMeta.DoesPropertyExist(kXMP_NS_DC, "title"))
    {
        std::string MyString;
        imageMeta.GetArrayItem(kXMP_NS_DC, "title", 1, &MyString, 0);
        [textField setStringValue:[NSString stringWithCString:MyString.c_str() encoding:[NSString defaultCStringEncoding]]];
    }
}

写作几乎是一样的。

imageMeta.SetProperty(<#XMP_StringPtr schemaNS#>, <#XMP_StringPtr propName#>, <#XMP_StringPtr propValue#>)

您可以在文档中找到所有命名空间常量,例如 kXMP_NS_DC XMP NameSpace DublinCore 等。

Apple 的 Image/IO 应该涵盖所有内容,但例如您可以使用 Image/IO 从 IPTC 读取署名条目,但您不能编写它。

图像/IO 参考

CGImageProperties 参考

于 2014-05-26T17:36:02.367 回答