一、环境说明
操作系统:Win 11
开发工具:visual studio 2022
开发环境框架:.Net Framework 4.7.2
调用开源库:BitMiracle.LibTiff.Net
二、图像文件头目录标签
JPG图像的标准文件头标签目录,带有GPS信息目录,如下图:
TIFF图像有其标准定义的标签目录,其中并不包括GPS信息标签。而我所查到的能进行文件头标签操作的库对TIFF图像数据进行GPS信息标签插入都失败了。(有经验的欢迎评论指导)
TIFF图像记录坐标一般是以图像左上角点的实际坐标,横纵向的像素分辨率,以及方向,定义的仿射六参数:
0:图像左上角的X坐标;
1:图像东西方向像素分辨率;
2:旋转角度,如果图像北方朝上,该值为0;
3:图像左上角的Y坐标;
4:旋转角度,如果图像北方朝上,该值为0;
5:图像南北方向像素分辨率;
但接触了Phase SDK后,发现飞思相机拍摄的IIQ格式图像经过SDK的【WriteAsTiff】以TIFF影像格式存储时,是带有GPS信息的,详细查证后发现其是以“XMPPacket”数据包标签存储的。那么就把直接给TIFF添加GPS信息标签转为给TIFF添加XMP数据包信息标签。
XMPPacket也叫XMLPacket,是Adobe定义的用于描述和嵌入元数据信息的标准。
三、创建项目并配置LibTiff开源库
1、创建 Windows桌面窗体应用(.Net Framework )
参考:三、调用Phase One SDK下 2.(1)创建一个桌面应用程序(.NET Framework)
2、设计一个简单的窗体应用
【打开】待添加GPS信息的TIFF影像,输入文本格式的 XMPPacket 到文本框,【添加】为TIFF影像插入XMPPacket。
3、安装LibTiff
点击【项目】→【管理NuGet程序包】,【浏览】下搜索“BitMiracle.LibTiff.Net”,点击【安装】。
4、引用并实现
通过NuGet安装的程序包会自动添加进引用,但程序文件中还需要添加【using BitMiracle.LibTiff.Classic;】。
using BitMiracle.LibTiff.Classic;
在【添加】按钮点击事件中完成为TIFF影像插入含有GPS信息的XMPPacket目录标签的功能。
private void buttonAdd_Click(object sender, EventArgs e)
{
try
{
using (Tiff tiff = Tiff.Open(textBoxTIF.Text, "a")) // “a”以修改的方式打开TIFF影像
{
if (tiff == null)
{
Console.WriteLine("打开TIFF影像失败!");
return;
}
tiff.SetDirectory(0); // 重点是这个设置回第一个目录
// 在新目录中添加一些元数据信息
byte[] xmpBytes = System.Text.Encoding.UTF8.GetBytes(textBox1.Text); // 将 XMP 文本数据转为字节数组
tiff.SetField(TiffTag.XMLPACKET, xmpBytes.Length, xmpBytes); // 写入 XMP 数据
// 将修改保存到新的 TIFF 文件
tiff.WriteDirectory(); // 写入目录
tiff.Close();// 关闭 TIFF 文件,保存修改
}
Console.WriteLine("新目录和XMPPacket标签添加成功!");
}
catch (Exception ex)
{
Console.WriteLine($"发生一个错误: {ex.Message}");
}
}
XMPPacket的字符串格式如下,如果只是添加GPS信息,只需更改即可,其他XMP的相关信息可以自行添加。需要注意的是xmp相关的信息行是必须的,否则将可能出错。
string xmpPacket = @"<x:xmpmeta xmlns:x=""adobe:ns:meta/"" x:xmptk=""XMP Core 5.5.0"">
<rdf:RDF xmlns:rdf=""http://www.w3.org/1999/02/22-rdf-syntax-ns#"">
<rdf:Description rdf:about=""""
xmlns:exif=""http://ns.adobe.com/exif/1.0/""
xmlns:xmp=""http://ns.adobe.com/xap/1.0/""
exif:GPSTimeStamp=""2023-12-26T20:37:01.108673""
exif:GPSLatitude=""31,50.879358N""
exif:GPSLongitude=""115,54.258666E""
exif:GPSAltitudeRef=""0""
exif:GPSAltitude=""934669/1000""
xmp:CreateDate=""2023-12-26T20:54:30""
xmp:Rating=""0""
xmp:CreatorTool=""©LuoXingZhou""/>
</rdf:RDF>
</x:xmpmeta>";
5、结果
执行程序后TIFF图像就包含GPS信息,这方便对于一些航测软件的使用,减少人工导入摄站GPS的过程。结果如图,原始TIFF(左),添加后TIFF(右)。
四、总结
就这简单的小玩意折腾了我nnnnnnnnn久,从来只知道TIFF图像标准文件头中的GPS是由仿射六参数进行定位,网上查了各种资料也都是如何写入仿射六参数的教程。但Phase SDK转换的TIFF却有EXIF的GPS标记,就一直在想怎么把EXIF信息中的GPS标记插入TIFF图像,始终无法成功,后来详细看了飞思相机的元数据标记,才发现它是存储在XMPPacket中的,最终顺利找到一个可行的方式。
虽然这个东西很简单,但此前各种查资料都没有提及,索性就记录一下~