Adobe XMP SDK项目应用(续2)
今日我想给给图像的exif属性里面增加一个SoftWare属性,毋庸置疑,最终是失败而告终。在SDk上面纠缠了半日,直奔核心代码而去,最终无功而返。问题的症结其实跟前几日差不多,修改xmp信息可以,但是修改exif信息,就得付出惨痛的代价,不断的调试...跟踪...调试...跟踪,问题点是跟踪出来了,在函数ExportTIFF_StandardMappings里面
static void
ExportTIFF_StandardMappings ( XMP_Uns8 ifd, TIFF_Manager * tiff, const SXMPMeta & xmp )
{const bool nativeEndian = tiff->IsNativeEndian();TIFF_Manager::TagInfo tagInfo;std::string xmpValue;XMP_OptionBits xmpForm;const TIFF_MappingToXMP * mappings = 0;if ( ifd == kTIFF_PrimaryIFD ) {mappings = sPrimaryIFDMappings;} else if ( ifd == kTIFF_ExifIFD ) {mappings = sExifIFDMappings;} else if ( ifd == kTIFF_GPSInfoIFD ) {mappings = sGPSInfoIFDMappings;} else {XMP_Throw ( "Invalid IFD for standard mappings", kXMPErr_InternalFailure );}for ( size_t i = 0; mappings[i].id != 0xFFFF; ++i ) {try { // Don't let errors with one stop the others.const TIFF_MappingToXMP & mapInfo = mappings[i];if ( mapInfo.exportMode == kExport_Never ) continue;if ( mapInfo.name[0] == 0 ) continue; // Skip special mappings, handled higher up.bool haveTIFF = tiff->GetTag ( ifd, mapInfo.id, &tagInfo );if ( haveTIFF && (mapInfo.exportMode == kExport_InjectOnly) ) continue;{bool haveXMP = xmp.GetProperty(mapInfo.ns, mapInfo.name, &xmpValue, &xmpForm);if (!haveXMP) {if (haveTIFF && (mapInfo.exportMode == kExport_Always)) tiff->DeleteTag(ifd, mapInfo.id);}else {XMP_Assert(tagInfo.type != kTIFF_UndefinedType); // These must have a special mapping.if (tagInfo.type == kTIFF_UndefinedType) continue;const bool mapSingle = ((mapInfo.count == 1) || (mapInfo.type == kTIFF_ASCIIType));if (mapSingle) {if (!XMP_PropIsSimple(xmpForm)) continue; // ? Notify client?ExportSingleTIFF(tiff, ifd, mapInfo, nativeEndian, xmpValue);}else {if (!XMP_PropIsArray(xmpForm)) continue; // ? Notify client?ExportArrayTIFF(tiff, ifd, mapInfo, nativeEndian, xmp, mapInfo.ns, mapInfo.name);}}}} catch ( ... ) {// Do nothing, let other imports proceed.// ? Notify client?}}} // ExportTIFF_StandardMappings
程序首先已经从tag里面获取到了tagInfo(里面包含了exif:SoftWare信息),紧跟着就从xmp中去获取属性信息,导致的结果就是从tag获取的信息实际上没有用到。修改方案如下(红色部分为新增加内容):
static void
ExportTIFF_StandardMappings ( XMP_Uns8 ifd, TIFF_Manager * tiff, const SXMPMeta & xmp )
{
const bool nativeEndian = tiff->IsNativeEndian();
TIFF_Manager::TagInfo tagInfo;
std::string xmpValue;
XMP_OptionBits xmpForm;const TIFF_MappingToXMP * mappings = 0;
if ( ifd == kTIFF_PrimaryIFD ) {
mappings = sPrimaryIFDMappings;
} else if ( ifd == kTIFF_ExifIFD ) {
mappings = sExifIFDMappings;
} else if ( ifd == kTIFF_GPSInfoIFD ) {
mappings = sGPSInfoIFDMappings;
} else {
XMP_Throw ( "Invalid IFD for standard mappings", kXMPErr_InternalFailure );
}for ( size_t i = 0; mappings[i].id != 0xFFFF; ++i ) {
try { // Don't let errors with one stop the others.
const TIFF_MappingToXMP & mapInfo = mappings[i];
if ( mapInfo.exportMode == kExport_Never ) continue;
if ( mapInfo.name[0] == 0 ) continue; // Skip special mappings, handled higher up.bool haveTIFF = tiff->GetTag ( ifd, mapInfo.id, &tagInfo );
if ( haveTIFF && (mapInfo.exportMode == kExport_InjectOnly) ) continue;
if (haveTIFF){
XMP_Assert(tagInfo.type != kTIFF_UndefinedType); // These must have a special mapping.
if (tagInfo.type == kTIFF_UndefinedType) continue;
if (tagInfo.type == kTIFF_ASCIIType)
xmpValue = (const char*)tagInfo.dataPtr;ExportSingleTIFF(tiff, ifd, mapInfo, nativeEndian, xmpValue);
}
else {
bool haveXMP = xmp.GetProperty(mapInfo.ns, mapInfo.name, &xmpValue, &xmpForm);
if (!haveXMP) {if (haveTIFF && (mapInfo.exportMode == kExport_Always)) tiff->DeleteTag(ifd, mapInfo.id);
}
else {XMP_Assert(tagInfo.type != kTIFF_UndefinedType); // These must have a special mapping.
if (tagInfo.type == kTIFF_UndefinedType) continue;const bool mapSingle = ((mapInfo.count == 1) || (mapInfo.type == kTIFF_ASCIIType));
if (mapSingle) {
if (!XMP_PropIsSimple(xmpForm)) continue; // ? Notify client?
ExportSingleTIFF(tiff, ifd, mapInfo, nativeEndian, xmpValue);
}
else {
if (!XMP_PropIsArray(xmpForm)) continue; // ? Notify client?
ExportArrayTIFF(tiff, ifd, mapInfo, nativeEndian, xmp, mapInfo.ns, mapInfo.name);
}
}
}} catch ( ... ) {
// Do nothing, let other imports proceed.
// ? Notify client?}
}
} // ExportTIFF_StandardMappings
也许是我对这套SDK还没研究透彻,或许在设置tag子初已经有更为简单有效的方式 ,总之我没发现,暂且先这么改完凑合用着吧。
Adobe XMP SDK项目应用(续2)相关推荐
- Adobe XMP SDK项目应用(续1)
XMP-Tool-SDK功能确实非常完备,但是要想应用于实际软件产品,踩坑不少.近日就遇到将GPS信息写入exif扩展属性项,始终写入不进去.虽然前期项目对这个库已经做过深入学习,但是经过这次的项目再 ...
- Adobe XMP SDK编译
XMP(Extensible Metadata Platform)是Adobe公司提出的关于元数据的创建,处理和交换的一套标准.在制作和管理文档或图像时,如果在相关文件中包含有元数据(如标题.摘要.作 ...
- 海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误
海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误 问题描述 解 ...
- Android Adobe XMP与JPEG
这篇文章的目的是简略的描述怎么在Android上将XMP信息写入JPEG文件,比如将图像的深度信息,全景图信息,连拍信息写入JPEG,Google Photos可以对一些特殊类型进行识别 Adobe ...
- APP版本管理SDK项目实战-准备篇
为什么80%的码农都做不了架构师?>>> 欢迎关注http://quanke.name/ 转载请注明出处,谢谢 因为友盟APP版本管理服务关闭(这是官方通知:http://bb ...
- android 直播sdk 抖音,从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建
不知不觉已经到了2019年,本系列的文章也更新到了8篇.很庆幸笔者能坚持下来,从我司的代码中学习到了很多东西.当然更庆幸的是收获了众多读者的鼓励和支持.从本篇文章开始,我们将接触短视频 app 中比较 ...
- MOBLIN SDK项目和目标:使用映像创建者
(作者:徐诚 http://blog.csdn.net/shizhebsys 保留版权) 准备开发 项目和目标:使用映像创建者 简介 映像创建者使用项目,目标和功能集(fset)来组织文件和包. Mo ...
- Android手游SDK那点事(二)SDK项目结构设计(初版,废弃)
项目构建 上一个完整架构图 以KSDK为名称模拟项目构建 项目建议: 1.这里游戏sdk不使用mvp或者mmvm的方式,其实这两种模式开发者在开发应用的时候不要盲目的使用,根据自己项目业务情况选择一个 ...
- 山景BP1048 导入SDK项目到工作空间
1.首先双击打开AndeSight300RDS软件,将SDK所在的文件夹目录添加到工作空间,再点击OK 2.点击文件 再次点击 导入 3.选择 常规→现有项目到工作空间→下一步 4.点击浏览 5.选 ...
最新文章
- Google智能生态链的演进路径
- Android:手把手教你 实现Activity 与 Fragment 相互通信(含Demo)
- VS2017调用MySQL 8.0(附上C++程序)
- java加密方式有哪些_面完平安JAVA,他们说了这些
- oracle加密可以跟java一致吗,在GBase 8s上使用java udr实现Oracle兼容的加密解密功能...
- python列表应用案例-python列表使用实例
- 给网站logo添加css帅气亮光扫过特效 附教程
- 提搞网站访问速度可做哪些优化
- JavaScript字符串方法——持续补充
- 组态王opc_组态王和西门子S7300、S7400系列PLC通讯的几种配置方案
- c++ 从double变为long int 数据丢失_面试官:Java 中有几种基本数据类型是什么?各自占用多少字节?...
- lena-ts 图像处理和卷积操作
- 聚合生态 云上未来 阿里巴巴游戏生态全链路赋能游戏产业
- 1999年中国省、自治区的城市规模结构特征的一些数据,可通过聚类分析将这些省、自治区进行分类_BeansSuperman_新浪博客
- AI绘图网站 MJ(Midjourney) 基础讲解+注册教程
- 新增轮播图跳转web页面、轮播、推荐歌单数据存储( 简易音乐 七)
- Kafka(二):生产者
- win10共享计算机win7,win10共享文件夹给win7的方法是什么_win10给win7共享文件夹的方法...
- 硅谷AI人才7位薪酬时代开启,甲骨文600万美元年薪挖AI专家
- InteractiveObject
热门文章
- post提交数据返回404错误
- GitBlit(代码提交)
- NSString文本替换
- 学习MATLAB的第一天,梳理一些见到的函数。1.matlab中sin、cos、tan三角函数问题。2.abs函数。3.vpa函数。4.disp函数。5.class函数。6.logical函数。
- 安卓handler的用法,handler举例
- JAVA中的Xms、Xmx、MetaspaceSize、MaxMetaspaceSize都是什么意思?
- pulp platform 的搭建
- TexMaker(Latex编辑器)软件的“文献引用”操作:Xelatex方式运行的操作方法
- 服务的隔离、降级和熔断
- Crash:reportSizeConfigurations ActivityRecord not found for Token xxx