我需要获取现有的jpg文件并修改其IPTC条目中的标题,描述和关键字。这里有几个主题,但都没有答案或部分答案。我已经知道如何阅读IPTC信息,但需要编辑它们。有人可以对这个研究得很少且鲜为人知的话题有所了解吗?
我拥有的是:
NSString: title
NSString: description
NSArray: keywords
NSString: path to the file
我想使用现有的IPTC数据拍摄现有图像,并用这些数据替换现有条目,但保留所有其他IPTC条目,例如位置,日期等。到目前为止我所知道的是我需要使用CGImageDestination。
由于
答案 0 :(得分:4)
您应首先阅读文件中的元数据:
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);
在上面的代码中,url
是图片文件的网址。 props
将在目标网址上包含图片的所有元数据。
然后,将该数据复制到新的可变空数据源:
//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];
答案 1 :(得分:3)
您应该使用XMP Toolkit SDK,您可以在adobe SDK page找到详细信息 实现有点棘手但是一旦你将静态库添加到项目中就可以读取和编写XMP信息,它还可以覆盖IPTC命名空间以及其他命名空间,如dublin-core等。
将库添加到项目代码之后。
#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读取行列,但是您无法写入。