使用Delphi读取Exif GPS信息

4
我需要从我的照片中获取地理位置信息,包括纬度/经度和GPS版本号。我已经找到了一些相关的信息,比较了不同的EXIF头文件,并找到了一个十六进制转储,可以给我坐标 - 现在我需要从文件中获取它。
这个问题可能看起来非常简单。如何在Delphi中打开JPEG文件以获取必要的十六进制转储?
已经尝试读取字符和整数,但没有任何作用。如果可能的话,我不想使用任何外部库来完成此任务。
这基本上是我的主要问题,但如果有人能回答另一个问题,我会非常高兴。
是否有一种简单的方法可以搜索GPS标记而无需搜索特定的十六进制转储文件?现在我正在寻找一个奇怪的组合12 00 02 00 07 00,真的很有效。我已阅读过EXIF文档,但我实际上无法理解GPS标记的内容。

2
Chris Rolliston 制作了一个用于读取 Exif 信息的库。例如,读取 GPS 信息和源代码请点击这里 - LU RD
谢谢。我在这里看到了关于CCR的信息(http://delphihaven.wordpress.com/ccr-exif)。但它只是一个库。 - user1131662
2
@user1131662:然后使用Chris的代码作为基础,看看如何自己实现。这是开源代码,会向您展示“带有GPS标记的事情”。我不明白问题所在。您不必使用库来研究其代码。“这里有免费的源代码,向您展示如何做到这一点。”“好吧,我不想阅读它,因为它来自一个库。”这是不合逻辑的。 - Ken White
1个回答

7
如果您不需要使用外部库,可以使用TFileStream和字节数组来完成这个任务。我在一个项目中使用了这种方法来获取“拍摄日期”,GPS纬度和经度坐标只是EXIF头中的另一个字段。我没有代码在手,但方法很简单:一旦您有了指向JPEG文件的TFileStream:
  • 读取前2个字节,检查它是否为$FF $D8(以确保它是有效的JPEG)
  • 读取接下来的2个字节,检查它是否为$FF $E1
  • 如果是,读取4个字节并查看它是否为“Exif”($45 $78 $69 $66)
  • 接下来是$00 $00和一个8字节的TIFF头,其中包含一般信息,比如字节序,然后是您需要处理并获取所需的EXIF标签,我快速搜索找到了一个列表在这里:http://www.exiv2.org/tags.html

由于可以安全地假设EXIF数据位于JPEG文件的前几千字节中,因此您可以在一个字节数组(或TMemoryStream)中读取这么多数据并在那里处理数据,这应该比从TFileStream中单独读取小块数据要快。


1
关于步骤1:https://dev59.com/TXbZa4cB1Zd3GeqPFWVY,步骤2:https://dev59.com/ulXTa4cB1Zd3GeqP2YWi - Free Consulting
非常感谢,我认为这正是我所需要的。如果我能够使用这种方法获得精确的字节序列,那么我就完全满意了。 - user1131662
有人已经编写了这个代码吗?我只想提取方向.. - zeus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接