XMP-Tool-SDK功能确实非常完备,但是要想应用于实际软件产品,踩坑不少。近日就遇到将GPS信息写入exif扩展属性项,始终写入不进去。虽然前期项目对这个库已经做过深入学习,但是经过这次的项目再次涉及才知道,还远远不够深入。
GPS信息写入代码其实很简单:
CString sValue = pPosInfo->m_strRTKPOSlatitude;
UINT deg = 0, min = 0, sec = 0, ref = 0;
CSysUtils::LonOrLanToDegMinSecond(_tstof(sValue), deg, min, sec, ref);
XMP_Uns32 loc[6];
exifMgr->PutUns32(deg, &loc[0]);
exifMgr->PutUns32(1, &loc[1]);
exifMgr->PutUns32(min, &loc[2]);
exifMgr->PutUns32(1, &loc[3]);
exifMgr->PutUns32(sec * 1000000 + ref, &loc[4]);
exifMgr->PutUns32(1000000, &loc[5]);
exifMgr->SetTag(kTIFF_GPSInfoIFD, kTIFF_GPSLatitude, kTIFF_RationalType, 3, &loc[0]);
将经纬度转换成度分秒的形式,然后配合Rational结构或者上述代码即可。应用层调用代码就是如此简单,但是底层通过了将近4天的调试跟踪,临近崩溃边缘(准备放弃休息一天再说),意外发现仅仅只是SDK内部逻辑处理的时候出现了问题。XMP-Tool-SDK顾名思义,主要是针对处理XMP信息而设计的,而GPS的exif信息不在其重点要处理的数据之列。通过排查,exif中的GPS信息是无论如何也不会写入成功的。
问题1:如果通过上述代码设置了exif的GPS信息,只是为了写入XMP提供了一个数据而已,数据用完了,exif中的GPS节点还是被删除,这个问题需要解决。
问题2:既然设定了exif中的GPS属性,为啥还是会被删除呢?是因为sGPSInfoIFDMappings结构体中将其exportMode设置为了kExport_Always属性(可以通过修改默认属性值)。为什么要这么设定,是因为既然XMP已经有了GPS信息了,exif就没有存在的必要了。那只保留exif中的GPS,而不要XMP信息不行吗?对不起,这个库是专门针对XMP设计的,所以如果你需要这样做,就请自己改代码吧,反正接口作者思虑周到,都提前给我们预留好着呢。