时下随着科技的发展,航拍很是流行,对于繁多图像的建模,大疆智图(DJI Terra)软件算是行业中的佼佼者了。图像数据信息中自带XMP信息,建立模型后,图像就能自动定位显示出来了。可是有时候XMP信息存在于附加中间中,并没有附加在图像的数据信息中,于是我们可以通过Adobe XMP ToolKit开发包将XMP信息写入到文件中去。完整的XMP信息大致是这样的:
<?xpacket begin="?" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="DJI Meta Data"
xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
xmlns:exif="http://ns.adobe.com/exif/1.0/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:crs="http://ns.adobe.com/camera-raw-settings/1.0/"
xmlns:drone-dji="http://www.dji.com/drone-dji/1.0/"
xmp:ModifyDate="2019-12-07"
xmp:CreateDate="2019-12-07"
tiff:Make="DJI"
tiff:Model="FC6310R"
dc:format="image/jpg"
drone-dji:AbsoluteAltitude="+521.99"
drone-dji:RelativeAltitude="+55.02"
drone-dji:GpsLatitude="30.52604783"
drone-dji:GpsLongtitude="104.23446548"
drone-dji:GimbalRollDegree="+0.00"
drone-dji:GimbalYawDegree="-47.30"
drone-dji:GimbalPitchDegree="-89.90"
drone-dji:FlightRollDegree="+2.50"
drone-dji:FlightYawDegree="-48.00"
drone-dji:FlightPitchDegree="-4.30"
drone-dji:FlightXSpeed="+2.60"
drone-dji:FlightYSpeed="-3.00"
drone-dji:FlightZSpeed="+0.00"
drone-dji:CamReverse="0"
drone-dji:GimbalReverse="0"
drone-dji:SelfData="Undefined"
drone-dji:CalibratedFocalLength="3666.666504"
drone-dji:CalibratedOpticalCenterX="2736.000000"
drone-dji:CalibratedOpticalCenterY="1824.000000"
drone-dji:RtkFlag="50"
drone-dji:RtkStdLon="0.01122"
drone-dji:RtkStdLat="0.00986"
drone-dji:RtkStdHgt="0.02336"
drone-dji:DewarpData=" 2018-12-05;3689.740000000000,3682.860000000000,-9.500000000000,10.800000000000,-0.262097000000,0.109604000000,0.000901229000,0.000162288000,-0.037969600000"
drone-dji:DewarpFlag="0"
crs:Version="7.0"
crs:HasSettings="False"
crs:HasCrop="False"
crs:AlreadyApplied="False">
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
samples中的ModifyingXMP.cpp的代码已经教会了我们怎么讲XMP信息写入到图像文件中去,在这里我就不重点介绍了。写入以后会发现,图像在中始终加载失败,经过一天时间不断的测试对比发现,是属性值rdf:about=""为空造成的,怎么样修改这个值呢,代码其实非常简单:
meta.SetObjectName("DJI Meta Data");
加上这行代码,图像就能够被软件成功加载了。一天的辛苦工作,只为了寻找这1行代码,个中滋味真是......。这期间有过放弃XMPCore的想法,试图采用IWIC接口来实现XMP信息的读取和写入,虽然也能实现XMP信息的写入(同时也支持IFD等等所有图像的读取和写入,这一点比XMPCore完善太多了),但是结局也是非常糟糕,不能设置rdf:about的属性值,且没有源码,只能中途放弃,重新又回归XMPCore上面来了。
上面提到IWIC可以很轻易的修改IFD里面的信息,那么XMPCore是否也支持这种功能呢?带着这个问题,我重新阅读XMPCore的代码,发现底层在TIFF_Manager里面已经实现了对图像的各项信息的修改SetTag和读取GetTag,但是在XMPFiles里面并没有将这些接口开放到应用层中开,比较这套接口的核心重点是实现XMP信息的读取和写入。并且如果是修改IFD信息,除了IWIC接口还有GDI+、libExif、Exiv2等等,它们都可以很轻易的实现这些功能。