首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IPTC数据写入文件

将IPTC数据写入文件
EN

Stack Overflow用户
提问于 2014-05-26 17:09:24
回答 2查看 1.1K关注 0票数 3

我需要接受一个现有的jpg文件,并修改其IPTC条目中的标题、描述和关键字。这里有几个主题,但要么没有答案,要么有部分答案。我已经知道如何阅读IPTC的信息,但需要编辑它们。有人能为这个研究较少的话题提供一些线索吗?

我拥有的是:

代码语言:javascript
复制
NSString: title
NSString: description
NSArray: keywords
NSString: path to the file

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-26 18:29:02

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

代码语言:javascript
复制
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);

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

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

代码语言:javascript
复制
//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 ):

代码语言:javascript
复制
//copy image data
CGImageDestinationAddImageFromSource(imgDest, source, 0, (__bridge CFDictionaryRef)(modifiedMetadata));
BOOL success = CGImageDestinationFinalize(imgDest);

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

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

代码语言:javascript
复制
[resultData writeToFile:fileName atomically:YES];
票数 4
EN

Stack Overflow用户

发布于 2014-05-26 17:36:02

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

在像这样的项目代码中添加库之后。

代码语言:javascript
复制
#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]]];
    }
}

写作也差不多。

代码语言:javascript
复制
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参考

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23874865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档