关于十六进制形式的 EXIF 的问题

2023-11-27

我试图了解 jpeg 文件(十六进制)的 EXIF 标头部分以及如何理解它,以便我可以提取数据,特别是 GPS 信息。无论好坏,我正在使用 VB.Net 2008(抱歉,这是我现在能掌握的)。我已将 jpg 的前 64K 提取到字节数组中,并且对数据的排列方式有一个模糊的概念。使用 EXIF 规范文档 2.2 和 2.3 版,我看到有一些标签,它们应该与文件中的实际字节序列相对应。我看到有一个“GPS IFD”,其值为 8825(十六进制)。我在文件中搜索十六进制字符串 8825(据我所知是两个字节 88 和 25),然后我相信 8825 后面有一个字节序列。我怀疑这些后续字节表示文件中的位置,通过通过偏移方式,可以定位 GPS 数据。例如,我有以下十六进制字节,从 88 25 开始: 88 25 00 04 00 00 00 01 00 00 05 9A 00 00 07 14. 我要查找的字符串是否超过 16 个字节?我的印象是,在这串数据中,它应该告诉我在文件中哪里可以找到实际的 GPS 数据。

看着http://search.cpan.org/~bettelli/Image-MetaData-JPEG-0.153/lib/Image/MetaData/JPEG/Structures.pod#Exif_and_DCT在页面的中间,它谈到“每个 IFD 块都是一个结构化的记录序列,用 Exif 行话来说,称为互操作性数组。第 0 个 IFD 的开头由“IFD0_Pointer”值给出。 IFD 的结构如下:”

那么,什么是 IFD0_Pointer?与偏移量有关系吗?我认为偏移量距起始点有很多字节。如果这是真的,那么起点在哪里?

感谢您的任何回复。

Dale


我建议你阅读Exif 规格(PDF);它很清楚并且很容易遵循。作为一个简短的入门知识,这里是一个总结article我写:


JPEG/Exif 文件以图像标记 (SOI) 开头。 SOI 由两个魔术字节组成0xFF 0xD8,将文件识别为 JPEG 文件。 SOI 之后有许多应用程序标记部分(APP0、APP1、APP2、APP3...),通常包括元数据。

应用标记部分

每个 APPn 部分都以一个标记开始。对于 APP0 部分,标记为0xFF 0xE0,对于 APP1 部分0xFF 0xE1, 等等。标记字节后面跟着两个字节,表示该部分的大小(不包括标记,包括大小字节)。长度字段后面是可变大小的应用程序数据。 APPn 部分是连续的,因此您可以跳过整个部分(通过使用部分大小),直到到达您感兴趣的部分。APPn 部分的内容有所不同,以下是 Exif APP1 部分only.

Exif APP1 部分

Exif 元数据存储在anAPP1 部分(可能有多个 APP1 部分)。 Exif APP1 部分中的应用程序数据由 Exif 标记组成0x45 0x78 0x69 0x66 0x00 0x00 ("Exif\0\0")、TIFF 标头和许多图像文件目录 (IFD) 部分。

TIFF 标头

TIFF 标头包含有关 IFD 部分的字节顺序的信息以及指向第 0 个 IFD 的指针。前两个字节是0x49 0x49 (II对于英特尔)如果字节顺序是小尾数或0x4D 0x4D (MM对于摩托罗拉)用于大端。接下来的两个字节是魔术字节0x00 0x2A (42;))。接下来的四个重要字节将告诉您从 TIFF 标头开始处到第 0 个 IFD 的偏移量。

重要的:JPEG 文件本身(您到目前为止一直在阅读的文件)将始终采用大端格式。但是,IFD小节的字节顺序可能不同,需要转换(您可以从上面的TIFF头中知道字节顺序)。

图像文件目录

一旦到达这里,您就可以将指针指向第 0 个 IFD 部分,并且准备好读取实际的元数据。其余的 IFD 在不同的地方被引用。 Exif IFD 和 GPS IFD 的偏移量在第 0 个 IFD 字段中给出。第 0 个 IFD 字段后给出第一个 IFD 的偏移量。 Exif IFD 中给出了互操作性 IFD 的偏移量。

IFD 只是元数据字段的连续记录。字段计数在 IFD 的前两个字节中给出。字段计数后面是 12 字节字段。在这些字段之后,有一个从 TIFF 标头的开头到第一个 IFD 的开头的 4 字节偏移量。该值仅对第 0 个 IFD 有意义。接下来是 IFD 数据部分。

IFD 字段

字段是 IFD 部分的 12 字节子部分。每个字段的前两个字节给出 Exif 标准中定义的标签 ID。接下来的两个字节给出了字段数据的类型。你将会拥有1 for byte, 2 for ascii, 3 for short (uint16), 4 for long (uint32)等。查看 Exif 规范以获取完整列表。

接下来的四个字节可能有点令人困惑。对于字节数组 (ascii and undefined types),给出了数组的字节长度。例如,对于 Ascii 字符串:"Exif",计数将为 5(包括空终止符)。对于其他类型,这是场分量的数量(例如 4 个空头,3 个有理数)。

计数之后,我们得到 4 字节字段值。然而,如果字段数据的长度超过4个字节,它将被存储在IFD数据部分。在这种情况下,该值将是从 TIFF 标头的开头到字段数据的开头的偏移量。例如,对于一个long (uint32,4 个字节),这将是字段值。为一个rational (2 x uint32, 8 字节),这将是 8 字节字段数据的偏移量。


这基本上就是 JPEG/Exif 文件中元数据的排列方式。有一些注意事项需要记住(记住根据需要转换字节顺序,偏移量是从 TIFF 标头的开头开始,跳转到数据部分以读取长字段,...),但格式非常容易阅读。以下是 JPEG/Exif 文件的颜色编码十六进制视图。蓝色块代表 SOI,橙色块代表 TIFF 标头,绿色块代表 IFD 大小和偏移字节,浅紫色块代表 IFD 字段,深紫色块代表字段数据。

HEX View of a JPEG/Exif File

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于十六进制形式的 EXIF 的问题 的相关文章

  • 导出的 Google+ 照片,如何将 JSON 数据转换为 EXIF?

    最近使用 Google Takeout 从 Google 下载了 60GB 以上的照片和视频 这会产生大量文件 但有价值的元数据 包括照片的原始日期和位置 通常存储在每个相册的单独的metadata json 文件中 而不是存储在 EXIF
  • 从十六进制 istream 中读取双精度值

    Given double foo我可以使用十六进制格式字符串分配它sscanf像这样 sscanf 0XD lg foo 但我似乎无法得到istringstream以同样的方式行事 所有这些都只需写入 0 即可foo istringstre
  • 使用 Carrierwave 和 rmagick 上传到 s3 的 exif 图像旋转问题

    我的 Rails 应用程序中有照片上传功能 该应用程序通过 rmagick 和雾通过 Carrierwave 直接上传到 s3 我遇到的问题是 当通过手机通过肖像中的 拍照选项 上传照片时 注意这是 iPhone 上的 但我相信 Andro
  • 十六进制数可以与十进制数相加/相减吗?

    当用 C 编程时 假设我有一个十六进制值的整数 h 和一个十进制数的整数 d h 和 d 之间可以做加法或减法吗 或者它们必须处于相同的数字系统中 是的 你可以写 int x 100 0x100 0100 这将十进制与十六进制和八进制混合在
  • iOS PNG图像旋转90度

    在我正在编写的 iOS 应用程序中 我处理 PNG 因为我处理 Alpha 通道 由于某种原因 我可以将 PNG 加载到我的imageView很好 但是当需要将图像从我的应用程序复制到粘贴板上或将图像保存到我的相机胶卷时 图像会旋转 90
  • 创建ECDSA公钥给定曲线和公共点?

    我正在努力从公钥的字符串表示形式创建 ECDSA 公钥 即 string devicePublicKey 86FB5EB3CA0507226BE7197058B9EC041D3A3758D9D9C91902ACA3391F4E58AEF13
  • 改变 #RGB 颜色的饱和度:这里缺少什么?

    下面是亮度 饱和度改变程序的概念brightness and saturation function brightness colorstr steps return sprintf 02x 02x 02x r g b function s
  • 用于匹配文件中的十六进制数字的 Java 正则表达式

    所以我正在读取一个文件 例如java程序 58 68 58 68 40 c 40 48 FA 如果我幸运的话 但更常见的是 它在每行之前和之后都有几个空白字符 这些是我正在解析的十六进制地址 我基本上需要确保我可以使用扫描仪 缓冲阅读器等来
  • 如何将十六进制字符串分配给 char[] 变量?

    假设我的十六进制字符串 hexStr aecf 如何将十六进制字符串值分配给unsigned char myChar 如下 谢谢 myChar 0 0xae myChar 1 0xcf 您可以按如下方式转换数据 char hexstr ae
  • 将 numpy 数组转换为十六进制字节数组

    我想在 python 2 7 中将 numpy 数组转换为字节串 比如说我的 numpy 数组a是一个简单的2x2数组 看起来像这样 1 10 16 255 我的问题是 如何将此数组转换为字节字符串或字节数组 输出如下 x01 x0A x1
  • 如何去掉 CR (^M) 并保留 LF (^J) 字符?

    我正在尝试使用 Hexl 模式手动从文本文件中删除一些特殊字符 但不知道如何在 Hexl 模式下删除任何内容 我真正想要的是删除回车符并保留换行符 Hexl 模式是执行此操作的正确方法吗 无需寻找替代 就用吧 M x delete trai
  • RGBA格式HEX转换成RGB格式HEX? PHP

    我想在 RGBA 格式的十六进制颜色之间来回转换 例如0xFF0000FF 和 RGB 格式的十六进制颜色 例如0xFF0000 在 PHP 中 我怎样才能做到这一点 这两个函数将满足您的需要 function rgbaToRgb rgba
  • 小米Exif方向标签错误

    我在用着ExifInterface对于通过检测方向标签从图库中选取的旋转图像 它正在工作 最近我在小米9 SE上测试了应用程序 发现相机拍摄的照片有方向标签8 旋转270 但照片方向是正确的 不需要旋转 为什么方向标签错误 如何找到正确的旋
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • CSS Hex 到速记十六进制转换

    将十六进制转换为速记十六进制的正确算法是什么 例如 996633很容易被转换为 963 但如果是这样怎么办 F362C3 我的第一个猜测是我只取每种颜色的第一个值并使用它 所以 F362C3变成 F6C 但我不知道如何从数学上证明这种方法的
  • 如何随机获得Material Design Color?

    谷歌有他们的颜色 指南 http www google com design spec style color html 那么如何随机接收一个颜色呢 有没有办法指定表中的数字并从表的所有颜色中接收随机颜色 例如getMatColor 100
  • 在 Android 应用程序中编辑/添加 IPTC 元数据

    我看过许多其他类似的问题 但似乎没有一个有准确的答案 我正在开发一个可处理大量图像的 Android 应用程序 我希望通过编辑 IPTC 关键字标签 或其他适当标签 的值来向图像添加信息 我在用元数据提取器 http drewnoakes
  • printf() 格式化十六进制

    为什么当将十六进制数字打印为带前导零的 8 位数字时 08X not显示相同的结果0x 08X 当我尝试使用前者时 08格式化标志已被删除 并且它不适用于仅8 The 部分给你一个0x在输出字符串中 这0和x计算您在列表中列出的 8 个字符
  • Java - 将无符号十六进制字符串解析为有符号长整型

    我有一堆十六进制字符串 其中之一是 d1bc4f7154ac9edb 这是 3333702275990511909 的十六进制值 如果执行 Long toHexString d1bc4f7154ac9edb 这与您得到的十六进制相同 现在
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做

随机推荐

  • 最佳实践:Android 上的布局(编程与 XML)

    这个问题已经困扰我一段时间了 我已经在 Android 平台上开发了几个应用程序 并且总是发现自己求助于 Java 代码来构建布局 在专业的开发环境中 这是可以接受的吗 或者 XML 文件应该成为首选方法 我通常发现 XML 是一种更乏味的
  • 如何在同一个 Ruby Rails 项目中配置 MongoMapper 和 ActiveRecord

    我有一个现有的生产 Ruby Rails 应用程序 我希望在时间允许的情况下将其迁移到 MongoDB 因为不能一次性全部重写 我希望能够在我接触到旧课程时就弃用它们 我打算使用 MongoMapper 我找不到任何人解释如何设置数据库配置
  • com.firebase.client.FirebaseException:无法解析类为 CLASS_NAME android 的节点

    我在使用 Firebase 更新现有值时遇到以下异常updateChildren方法 com firebase client FirebaseException Failed to parse node with class class c
  • 如何开始使用 Java 构建 Web 应用程序? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想开始使用 java 进行 Web 开发 不知道如何开始 该学什么 或者什么是最好学习和使用的 Web 框架 帮帮我 我假设您只是 Web 应用程序的新手 而不是 Java 本
  • 超类中的私有方法可以在子类中重写吗?

    Java中私有方法可以被重写吗 如果不是 那么下面的代码如何工作 class Base private void func System out println In Base Class func method class Derived
  • 如何解决UITableView滚动缓慢的问题

    我是第一次在真实设备上进行测试 在修复了一些明显的性能问题后 我陷入了如何平滑滚动的困境 这就是我所做的 数据在sqlite中 我有一个带有标题的小数组 我在每个标头数组中都有来自数据库的 Id 列表 e g 标头 A Id 1 2 标头
  • 我可以替换 Java 正则表达式中的组吗?

    我有这段代码 我想知道是否可以仅替换 Java 正则表达式中的组 而不是所有模式 代码 Pattern p Pattern compile d d String input 6 example input 4 Matcher m p mat
  • 将 JAX-RS bean 验证错误消息绑定到视图

    我们可以使用 bean 验证轻松验证 JAX RS 资源类字段或方法参数 如下所示 Size min 18 max 80 message 年龄必须在 min 和 max 之间 String Age 将错误消息绑定到 JSP 页面的最简单方法
  • GPS 是否已激活 - Flutter

    有没有办法在 Flutter 中找出 GPS 是激活还是停用 我使用插件location然而 我只得到位置 而不是 GPS 的状态 更新 地理定位器8 0 1 bool isLocationEnabled await Geolocator
  • API Youtube,如何获得喜欢和不喜欢

    在一个网站上 我使用 API Youtube 和 ZendGdata 来检索用户的所有视频 并使用视频及其信息创建网页 现在我需要在我的网站上添加一个喜欢或不喜欢视频的系统 并且我需要检索喜欢和不喜欢的数量 是的 这里有2个问题 所以 我检
  • selectonemenu 出现错误 java.lang.String 无法转换为 javax.faces.model.SelectItem

    我想填写一个选择菜单 但总是出现此错误 java lang String cannot be cast to javax faces model SelectItem 这是代码 public class ToolsJIRA implemen
  • 仅将 ASP.NET MVC 应用程序管理站点锁定到 LocalHost

    我有一个 ASP NET MVC 网站 我想向其中添加一个小型管理页面 我遇到的问题是 我将全部部署它 但 SSL 不可用 我同意要求管理员远程桌面并使用本地浏览器来执行管理 这可以做到吗 我基本上希望得到与
  • 创建 SQLite 数据库和表

    在 C 应用程序代码中 我想创建一个或多个 SQLite 数据库并与之交互 如何初始化一个新的 SQLite 数据库文件并打开它进行读写 数据库创建完成后 如何执行DDL语句创建表 下一个链接将为您带来一个很棒的教程 这对我帮助很大 如何在
  • Meteor.js 中的运营转型?

    Meteor js 支持操作转换吗 我正在开发一个与 Etherpad 相关的项目 我想使用 Meteor js 我认为它非常适合此类项目 如果我想使其具有可扩展性 那么运营转型对于我的项目来说非常重要 我目前的知识表明 流星不支持开箱即用
  • 黑莓推送通知实施

    如何为黑莓应用程序实现推送通知 我听说为此我需要购买一台 Blackberry Enterprise Server 每年花费 1400 美元 这是真的 实施推送通知的良好起点在哪里 我对 iPhone 推送开发有经验 但找不到黑莓的同等功能
  • 一个简单的投票系统:如何防止重复投票[重复]

    这个问题在这里已经有答案了 我正在构建一个带有投票选项的简单网络应用程序 我计划为投票最多的人提供现金奖励 所以我想要一个相对安全的系统 我有几个关于受孕的问题 我知道我的帖子与其他一些帖子类似 但似乎没有一个帖子足够具体到该平台 让我放心
  • 如何使用 ggproto 扩展 ggplot2 boxplot?

    我经常在工作中使用箱线图等ggplot2美学 但标准geom boxplot缺少对我来说重要的两件事 胡须末端和中间标签 感谢这里的信息 我编写了一个函数 gBoxplot lt function formula NULL data NUL
  • 使用箭头键,并在 Angular 中使用 keyup

    我有一个 Angular 项目 我想为箭头键实现一些功能 我尝试使用类似的东西 keyup keyCode Move itemArray UP 其中 keyCode 代表箭头键之一的代码 但是没有任何作用 这是我使用它的模板 模板 HTML
  • GMSAutocompleteViewController 仅显示 5 个结果

    我综合了GMS自动完成视图控制器在我的应用程序中 let autocompleteController GMSAutocompleteViewController autocompleteController delegate self l
  • 关于十六进制形式的 EXIF 的问题

    我试图了解 jpeg 文件 十六进制 的 EXIF 标头部分以及如何理解它 以便我可以提取数据 特别是 GPS 信息 无论好坏 我正在使用 VB Net 2008 抱歉 这是我现在能掌握的 我已将 jpg 的前 64K 提取到字节数组中 并