IIQ文件内gps信息的分析

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
近日有网友咨询,使用《vb.net 教程 5-7 Bitmap类 3 获得图片信息Exif 1》教程的代码可以打开IIQ文件,但是近期的IIQ图片却分析不了了。
网友还传了两张IIQ图片给我,使用系统(win10)自带的“照片”分别打开这两个文件,确实也是,一张能够看到gps信息,一张却看不到。
推测是IIQ文件结构有所变化。
网上找了一大圈,都没有IIQ文件相关资料,只获得了一些介绍性的信息。
我也根据网上的指引,下载了METADATAEXRACTOR组件生成程序进行分析,也不能获得gps相关信息。
最后只好自己查看IIQ文件十六进制内容了。使用WinHex打开文件,逐行查看,最后发现,gps信息在以<?xpacket begin......开始的数据里,再次分析发现,这段数据比较固定,一是大小固定,都是16759字节;二是都在文件末尾。


这样就很容易获得数据了。
按照《vb.net 教程 4-9 二进制文件读写 1》里面的内容进行读取二进制数据,然后转换为字符串就可以了。
具体代码如下:
 

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Dim xmpSign As Integer = 16759
        Dim xmpSize As Integer = 16364
        Dim xpackedHeader As String = "<?xpacket begin"

        Dim filepath As String = "G:\save\00067.IIQ"
        Dim fs As New FileStream(filepath, FileMode.Open, FileAccess.Read)

        Dim fileLenth As Long = fs.Length
        If fileLenth < xmpSign + 100 Then Exit Sub

        Dim bteXmp(xmpSize - 1) As Byte
        Dim pos As Long = fileLenth - xmpSign

        Try
            If fs.CanSeek Then
                Dim br As New BinaryReader(fs)
                fs.Seek(pos - 1, SeekOrigin.Begin)

                br.Read(bteXmp, 0, xmpSize)

                Dim tmpString As String
                tmpString = getString(bteXmp)

                If tmpString.Substring(0, 15) = xpackedHeader Then
                    TextBox1.Text = tmpString
                End If

                br.Close()
            End If
        Catch ex As Exception
            TextBox1.Text = "读取出错:" & ex.Message
        Finally

        fs.Close()
        End Try

    End Sub

    Private Function getString(ByVal buffer() As Byte) As String
        Return System.Text.Encoding.ASCII.GetString(buffer).Trim
    End Function

最后得到的数据如(由于某些原因,经纬度部分数字使用了?号代替):

<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d' ?><x:xmpmeta  xmlns:x='adobe:ns:meta/' x:xmptk='Adobe XMP Core 5.2-c004 1.136881, 2010/06/10-18:11:35'>
<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/'>
<exif:GPSTimeStamp>02:41:32.700+00:00</exif:GPSTimeStamp><exif:GPSLatitude>?0,?6.?31898N</exif:GPSLatitude><exif:GPSLongitude>1?0,?0.?19800E</exif:GPSLongitude>
<exif:GPSAltitudeRef>0</exif:GPSAltitudeRef>
<exif:GPSAltitude>308070/1000</exif:GPSAltitude>
</rdf:Description><rdf:Description rdf:about='' xmlns:aerialgps='http://www.phaseone.com/aerialgps/'></rdf:Description></rdf:RDF></x:xmpmeta>

只需要进一步分析就可以从<exif:GPSLatitude>和<exif:GPSLongitude>这两段获得拍摄的经纬度。
同时通过对数据分析,里面应该是包含了Adobe公司的XMP标准的数据,用网上的查找XMP信息的代码也没有获取到xpacket的信息,比较遗憾。

 

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供的参考。

学习更多vb.net知识,请参看 vb.net 教程 目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值