Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将IPTC数据写入文件_Objective C_Jpeg_Edit_Iptc - Fatal编程技术网

Objective c 将IPTC数据写入文件

Objective c 将IPTC数据写入文件,objective-c,jpeg,edit,iptc,Objective C,Jpeg,Edit,Iptc,我需要获取一个现有的jpg文件,并修改其IPTC条目中的标题、描述和关键字。关于这一点,这里有几个主题,但都没有答案或部分答案。我已经知道如何阅读IPTC信息,但需要对其进行编辑。有没有人能解释一下这个研究很多却鲜为人知的话题 我得到的是: NSString: title NSString: description NSArray: keywords NSString: path to the file 我希望使用现有IPTC数据获取现有图像,并用这些数据替换现有条目,但保留所有其他IPTC条

我需要获取一个现有的jpg文件,并修改其IPTC条目中的标题、描述和关键字。关于这一点,这里有几个主题,但都没有答案或部分答案。我已经知道如何阅读IPTC信息,但需要对其进行编辑。有没有人能解释一下这个研究很多却鲜为人知的话题

我得到的是:

NSString: title
NSString: description
NSArray: keywords
NSString: path to the file
我希望使用现有IPTC数据获取现有图像,并用这些数据替换现有条目,但保留所有其他IPTC条目,如位置、日期等。到目前为止,我只知道我需要使用CGImageDestination


谢谢

您应该使用XMP Toolkit SDK,您可以在 实现有点棘手,但一旦您将静态库添加到项目中,您就可以读写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]]];
    }
}
#包括“XMP.incl\u cpp”
#包括“XMP.hpp”
#包括
#包括
#包括
#包括
-(无效)readIPTC
{
SXMPMeta::Initialize()
SXMPMeta-imageMeta;
if(imageMeta.DoesPropertyExist(kXMP_NS_DC,“title”))
{
std::string MyString;
GetArrayItem(kXMP_NS_DC,“title”,1和MyString,0);
[textField setStringValue:[NSString stringWithCString:MyString.c_str()编码:[NSString defaultCStringEncoding]];
}
}
写作几乎是一样的

imageMeta.SetProperty(<#XMP_StringPtr schemaNS#>, <#XMP_StringPtr propName#>, <#XMP_StringPtr propValue#>)
imageMeta.SetProperty(,)
您可以在文档中找到所有名称空间常量,如kXMP_NS_DC XMP namespace DublinCore等

苹果的图像/IO应该涵盖所有内容,但你可以用图像/IO阅读IPTC的署名条目,但你不能写


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

CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);
在上面的代码中,
url
是图像文件的url<代码>道具将在目标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
):

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

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

[resultData writeToFile:fileName atomically:YES];

这是一种更好、更简单的方法,除非您想添加/删除单个属性,否则效果很好。@mohacs我在使用此代码时确实添加了一些属性。是的,您可以肯定,但正如我在回答中提到的,您不能添加所有属性(可能是一个bug)例如,在IPTC定义中,ByLine points creator接收到一个数组,但您无法(Photoshop未看到)将其添加到图像/io中,因为我使用的是XMP工具包。如果你能设法添加它,那就太好了。此外,我没有尝试使用image/io,但使用XMP工具包,我可以向许多文件类型添加元,如pdf、视频等。好的,这里有几个问题:1)修改元数据:如何编辑现有元数据?你能扩展你的例子来包括标题的编辑吗?2) 目标文件能否与源文件相同?3) 这段代码实际上是保存了文件还是准备了所有要保存的内容?谢谢这将帮助我身边的许多人:)NSMutableDictionary*Dict=[modifiedMetatada objectForKey@{IPTC}];为您提供IPTC字典。如果要更改标题[dicti setObject:@“我的标题在这里”forKey:@“标题/摘要”];然后您可以将dict添加到modifiedMetatada[modifiedMetatada setObject:dicta forKey@{IPTC}];我想我可能不得不使用你的解决方案,因为另一个似乎不能正常工作。我可以保存标题,但由于某些原因,描述没有保存。莫哈奇,请看另一个问题,悬赏在哪里。我最后的评论。谢谢你的帮助!
[resultData writeToFile:fileName atomically:YES];