寻找EXIF格式的数据

4
我遇到了一个问题,我的程序用于下载.JPG文件中的DateTimeOrginal数据。我在互联网上找到了相关文档:https://ExifTool.org/TagNames/EXIF.html。 我发现我正在寻找的数据位于0x9003地址。
因此,我现在正在尝试做的是:
temp = fopen(name, "rb");

打开二进制文件。
fseek (temp, 0x9003, SEEK_SET);

将文件指针移动到指定地址。
fscanf(temp, "%s", str);

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

以上有没有任何一个是正确的?我仍在考虑地址的问题,因为在编译该程序后,我只能看到来自文件的一些垃圾。


3
数值0x9003并不是一个“地址”,而是一个Exif标记。你需要深入了解Exif格式 - Jongware
这也许会有用:使用C++在Windows上读写exif/jpeg - Ilya
3
你要查找的数据以0x9003 标签开头。这是一个魔数,用于标识其后的数据。你需要先定位Exif数据块,然后找到以该标签开头的块的部分,那里就是数据的开始。 - molbdnilo
我仍在努力找出如何计算它。你能告诉我在哪里寻找相关信息吗?每张图片的数据应该从同一位置开始吗? - General_Code
我建议使用libexif库。 - kobigurk
显示剩余2条评论
2个回答

4
EXIF数据被嵌入到JPEG标签APP1(0xE1)中。
首先要做的是在流中找到jpef标签0xE1;您必须扫描所有的jpeg标签(由0xFF+标签标记,例如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()是用于定位文件位置,而不是搜索特定数字。


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