【TIFF GPS】TIFF图像添加EXIF的GPS信息标记

一、环境说明

操作系统: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中的,最终顺利找到一个可行的方式。

        虽然这个东西很简单,但此前各种查资料都没有提及,索性就记录一下~

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值