【问题标题】:Looking for data in EXIF format查找 EXIF 格式的数据
【发布时间】:2014-08-24 06:30:39
【问题描述】:

我的程序用于从 .JPG 文件下载 DateTimeOrginal 数据时遇到问题。我在网上找到了关于它的文档:

https://ExifTool.org/TagNames/EXIF.html

我看到我要查找的数据位于 0x9003 地址。

所以现在我想做的是:

temp = fopen(name, "rb");

打开二进制文件

fseek (temp, 0x9003, SEEK_SET);

将文件指针移动到地址

fscanf(temp, "%s", str);

并将数据加载到 char[] 结构中。

至少有一个是正确的吗?我仍然认为地址有问题,因为在编译该程序后,我只看到文件中的一些垃圾。

【问题讨论】:

  • 你在正确的轨道上。您将需要验证数据是否与您尝试读取信息的字符串兼容。我建议您下载并查看程序jhead 的源代码。请参阅:Exif Jpeg header manipulation tool 它将提供一个很好的例子。
  • 0x9003 不是“地址”,它是一个 Exif 标签标记。你需要read up a bit on the Exif format
  • 您要查找的数据以 0x9003 标签开头。这是一个神奇的数字,用于标识其后的数据。您必须先找到 Exif 数据块,然后找到该块中以该标记开头的部分,这就是数据开始的地方。
  • 我仍在尝试找出如何计算它。能给个资料吗,去哪里找?每张图片的数据都应该从同一个地方开始?

标签: c++ exif


【解决方案1】:

EXIF 数据嵌入 jpeg 标签 APP1 (0xE1)。

首先要做的是在流中找到jpef标签0xE1;您必须扫描所有 jpeg 标签(标记为 0xFF+tag,在您的情况下为 0xFF,0xE1)。获取标签后,通过读取接下来的 2 个字节(并调整为高端)找到它的长度,然后获取标签的内容。

获取标签的内容后,在其中查找您感兴趣的EXIF标签(0x9003)。

开源项目Imebra的jpeg类中的readStream方法给大家举个例子说明如何解析jpeg标签:https://bitbucket.org/binarno/imebra/src/2eb33b2170e76b5ad2737d1c2d81c1dcaccd19e5/project_files/library/imebra/src/jpegCodec.cpp?at=default#cl-867

【讨论】:

    【解决方案2】:

    鉴于 OP 的编程风格,我推荐 Easyexif,地址为 https://github.com/mayanklahiri/easyexif 它相对容易集成。请注意 fseek() 转到文件位置;它不会搜索某个数字。

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 2018-10-01
      • 1970-01-01
      • 2013-09-23
      • 2011-12-07
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多