使用Objective-C将XMP数据嵌入PNG图片

4
我需要在iOS应用程序中将自定义XMP文件嵌入到PNG文件中。目前,我能够做的是编译Adobe XMP工具包,生成一个Xcode项目,然后正确编译该项目。 从那时起,我不知道如何在我的Xcode项目中使用该库以及如何使用它。我在互联网上找到的信息很少。 有没有人做过相同的事情愿意提供帮助?

可能这会有所帮助:https://dev59.com/3VHTa4cB1Zd3GeqPUcn1 - Faysal Ahmed
@FaysalAhmed,那个链接帮助我到达了现在的位置。但无论如何,还是谢谢你。 - Aleph72
3个回答

3
如果您已经下载了Adobe XMP Toolkit SDK,您可以在“ModifyingXMP.cpp”文件中找到写入XMP元数据的示例,在“ReadingXMP.cpp”文件中找到读取已经写入XMP的文件的示例。请注意,我使用的是XMP-Toolkit-SDK-CC201607版本。
稍后您需要将静态文件和头文件包含在您的iOS项目中。仔细阅读说明,特别是关于您需要哪种类型的archs的生成方式。在我的情况下,我分别生成了[arm64,armv7,armv7s]和[x86_64],然后将它们合并在一起。
根据您的需求尝试修改“ModifyingXMP.cpp”。将这些源代码作为Objective-C++(带有.mm扩展名)包含在您的iOS应用程序项目中。不要忘记包含头文件,libXMPCoreStatic.a文件,libXMPFilesStatic.a文件,制作桥接头文件,并配置您的项目导入外部静态库。如果您不理解我所说的,请查看以下链接:

https://forums.adobe.com/thread/1360320

如何在Swift中使用.a静态库?

以下是我的演示项目的样子: 输入图像描述

XmpWriter.h 的实现:

#import <Foundation/Foundation.h>

@interface XmpWriter : NSObject

+(BOOL) writeXmp:(const char *) imageUrl Param1:(const char *) Param1 Param2:(float) param2 Param3:(float) Param3;
+(BOOL) readXmp:(const char *) imageUrl;

@end

在我的XmpWriter.mm文件中,我修改了createXMPFromRDF()方法,使其可以接受我的参数,例如:
SXMPMeta createXMPFromRDF(const char *Param1, float Param2, float Param3)

我希望你能从这里更接近你想要达成的目标。

嗨Kevin,非常感谢你的帮助。昨天我在编译库时遇到了困难,因为我没有将库“lipo”在一起,导致编译时出现错误。现在我已经解决了这个问题,我只有与你的项目中相同的两个库,但是我遇到了编译错误“找不到-lXMPCoreStatic库”。不知道如何解决,因为在构建设置中似乎都是正确的... - Aleph72
  1. 请使用“lipo -info”确认您已获取所需的所有架构。
  2. 转到“构建设置”并仔细检查您的“库搜索路径”。您应该在那里放置您的库路径。
- Kevin
lipo -info 命令输出如下:MacBook-Pro-de-Michele:ios mike$ lipo -info libXMPCoreStatic.a fat 文件 libXMPCoreStatic.a 中的架构为:armv7 i386 x86_64 arm64 MacBook-Pro-de-Michele:ios mike$ lipo -info libXMPFilesStatic.a fat 文件 libXMPFilesStatic.a 中的架构为:armv7 i386 x86_64 arm64。在库搜索路径中,我只有 $inherith 和 $(PROJECT_DIR)。 - Aleph72
好的,最终我已经成功编译了这个项目,并添加了两个库和“include”文件夹。现在我将尝试修改“ModifyingXMP.cpp”文件。 - Aleph72
我已经添加了XmpWriter.mm和.h文件(没有修改“createXMPFromRDF()”),并尝试构建。我得到了192个这种类型的错误:Undefined symbols for architecture x86_64: "std::string::_S_empty_rep()", referenced from: char* std::string::_S_construct<__gnu_cxx::__normal_iterator<char const*, std::string> >(__gnu_cxx::__normal_iterator<char const*, std::string>, __gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<char> const&, std::forward_iterator_tag) in libXMPFilesStatic.a(TimeConversionUtils.o)。有什么想法吗? - Aleph72
1
似乎您的静态库构建不正确。请前往“构建设置”,找到“C++标准库”并添加“libc++(支持c++11)”。如果这不能解决您的问题,请仔细阅读XmpToolkit文档,特别是“XMPProgrammersGuide.pdf”。您可以尝试在Google上搜索更多关于您特定问题的信息。我很久以前就做过这个,我不记得一些具体细节了。链接链接 - Kevin

2
iOS构建支持在XMP规范PDF中显示,这是在2016年7月添加的,但这表明它支持Xcode 7.2.1,因此可能这个库在Xcode 9中无法工作,因为不清楚它最近是否更新过。
至于更具体的使用XMP示例项目的方法,从上面链接的文档中,您应该能够找到一个名为ReadingXMP的演示程序,它应该是特定于平台的(对您在Xcode中很有帮助)。文档指出,这个演示将:

演示了使用XMPFiles和XMPCore组件的基本用法,从文件中获取只读XMP并通过XMP对象检查它。

你需要在命令行中编译和构建它们,从/samples/source开始,并将它们写入到/samples/target/中。我认为指定的filename将是SDK生成的Xcode项目,但正如你注意到的,那里并没有太多的文档说明。
我自己并没有真正使用过它,但我希望这会有所帮助 :)。

0

我曾遇到类似的问题,需要读取/写入XMP数据,最终选择创建Objective-C封装来替代Adobe XMP Toolkit作为更自然的API。

我希望这对某些人有用,你可以在Github和CocoaPods上找到它: https://github.com/IHEARTCOOKIES/XMPFramework


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