今日我想给给图像的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)相关推荐

  1. Adobe XMP SDK项目应用(续1)

    XMP-Tool-SDK功能确实非常完备,但是要想应用于实际软件产品,踩坑不少.近日就遇到将GPS信息写入exif扩展属性项,始终写入不进去.虽然前期项目对这个库已经做过深入学习,但是经过这次的项目再 ...

  2. Adobe XMP SDK编译

    XMP(Extensible Metadata Platform)是Adobe公司提出的关于元数据的创建,处理和交换的一套标准.在制作和管理文档或图像时,如果在相关文件中包含有元数据(如标题.摘要.作 ...

  3. 海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误

    海康sdk项目部署Linux系统时出现java.lang.UnstisfiedLinkError:jnidispatch(xxx)not found in resource path错误 问题描述 解 ...

  4. Android Adobe XMP与JPEG

    这篇文章的目的是简略的描述怎么在Android上将XMP信息写入JPEG文件,比如将图像的深度信息,全景图信息,连拍信息写入JPEG,Google Photos可以对一些特殊类型进行识别 Adobe ...

  5. APP版本管理SDK项目实战-准备篇

    为什么80%的码农都做不了架构师?>>>    欢迎关注http://quanke.name/ 转载请注明出处,谢谢 因为友盟APP版本管理服务关闭(这是官方通知:http://bb ...

  6. android 直播sdk 抖音,从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建

    不知不觉已经到了2019年,本系列的文章也更新到了8篇.很庆幸笔者能坚持下来,从我司的代码中学习到了很多东西.当然更庆幸的是收获了众多读者的鼓励和支持.从本篇文章开始,我们将接触短视频 app 中比较 ...

  7. MOBLIN SDK项目和目标:使用映像创建者

    (作者:徐诚 http://blog.csdn.net/shizhebsys 保留版权) 准备开发 项目和目标:使用映像创建者 简介 映像创建者使用项目,目标和功能集(fset)来组织文件和包. Mo ...

  8. Android手游SDK那点事(二)SDK项目结构设计(初版,废弃)

    项目构建 上一个完整架构图 以KSDK为名称模拟项目构建 项目建议: 1.这里游戏sdk不使用mvp或者mmvm的方式,其实这两种模式开发者在开发应用的时候不要盲目的使用,根据自己项目业务情况选择一个 ...

  9. 山景BP1048 导入SDK项目到工作空间

    1.首先双击打开AndeSight300RDS软件,将SDK所在的文件夹目录添加到工作空间,再点击OK 2.点击文件  再次点击 导入 3.选择 常规→现有项目到工作空间→下一步 4.点击浏览 5.选 ...

最新文章

  1. Google智能生态链的演进路径
  2. Android:手把手教你 实现Activity 与 Fragment 相互通信(含Demo)
  3. VS2017调用MySQL 8.0(附上C++程序)
  4. java加密方式有哪些_面完平安JAVA,他们说了这些
  5. oracle加密可以跟java一致吗,在GBase 8s上使用java udr实现Oracle兼容的加密解密功能...
  6. python列表应用案例-python列表使用实例
  7. 给网站logo添加css帅气亮光扫过特效 附教程
  8. 提搞网站访问速度可做哪些优化
  9. JavaScript字符串方法——持续补充
  10. 组态王opc_组态王和西门子S7300、S7400系列PLC通讯的几种配置方案
  11. c++ 从double变为long int 数据丢失_面试官:Java 中有几种基本数据类型是什么?各自占用多少字节?...
  12. lena-ts 图像处理和卷积操作
  13. 聚合生态 云上未来 阿里巴巴游戏生态全链路赋能游戏产业
  14. 1999年中国省、自治区的城市规模结构特征的一些数据,可通过聚类分析将这些省、自治区进行分类_BeansSuperman_新浪博客
  15. AI绘图网站 MJ(Midjourney) 基础讲解+注册教程
  16. 新增轮播图跳转web页面、轮播、推荐歌单数据存储( 简易音乐 七)
  17. Kafka(二):生产者
  18. win10共享计算机win7,win10共享文件夹给win7的方法是什么_win10给win7共享文件夹的方法...
  19. 硅谷AI人才7位薪酬时代开启,甲骨文600万美元年薪挖AI专家
  20. InteractiveObject

热门文章

  1. post提交数据返回404错误
  2. GitBlit(代码提交)
  3. NSString文本替换
  4. 学习MATLAB的第一天,梳理一些见到的函数。1.matlab中sin、cos、tan三角函数问题。2.abs函数。3.vpa函数。4.disp函数。5.class函数。6.logical函数。
  5. 安卓handler的用法,handler举例
  6. JAVA中的Xms、Xmx、MetaspaceSize、MaxMetaspaceSize都是什么意思?
  7. pulp platform 的搭建
  8. TexMaker(Latex编辑器)软件的“文献引用”操作:Xelatex方式运行的操作方法
  9. 服务的隔离、降级和熔断
  10. Crash:reportSizeConfigurations ActivityRecord not found for Token xxx