【问题标题】:Questions about EXIF in hexadecimal form关于十六进制形式的EXIF的问题
【发布时间】:2016-10-11 18:33:18
【问题描述】:

我正在尝试了解 jpeg 文件的 EXIF 标头部分(十六进制)以及如何理解它,以便我可以提取数据,特别是 GPS 信息。无论好坏,我使用的是 VB.Net 2008(对不起,这是我现在能掌握的)。我已将 jpg 的前 64K 提取到一个字节数组中,并且对数据的排列方式有一个模糊的概念。使用 EXIF 规范文档,版本 2.2 和 2.3,我看到有标签,应该对应于文件中的实际字节序列。我看到有一个值为 8825(十六进制)的“GPS IFD”。我在文件中搜索十六进制字符串 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?它与偏移量有关吗?我认为偏移量是从起点开始的这么多字节。如果这是真的,那起点在哪里?

感谢您的任何回复。

戴尔

【问题讨论】:

  • 我想我可能已经找到了我正在寻找的信息on MSDN,这似乎是对我正在寻找的东西的一个很好的讨论。

标签: exif hex


【解决方案1】:

我建议您阅读Exif Specification (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 部分.

Exif APP1 部分

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

TIFF 标头

TIFF 标头包含有关 IFD 部分的字节顺序的信息和指向第 0 个 IFD 的指针。如果字节顺序是 little-endian,前两个字节是 0x49 0x49(对于 Intel 是 II),对于 big-endian,前两个字节是 0x4D 0x4D(对于 Motorola 是 MM)。以下两个字节是魔术字节0x00 0x2A (42 ;))。以下四个重要字节将告诉您从 TIFF 标头开始到第 0 个 IFD 的偏移量。

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

图像文件目录

一旦你走到这一步,你就有了指向第 0 个 IFD 部分的指针,你就可以阅读实际的元数据了。其余的 IFD 在不同的地方引用。 Exif IFD 和 GPS IFD 的偏移量在第 0 个 IFD 字段中给出。第一个 IFD 的偏移量在第 0 个 IFD 字段之后给出。互操作性 IFD 的偏移量在 Exif IFD 中给出。

IFD 只是元数据字段的简单顺序记录。字段计数在 IFD 的前两个字节中给出。字段计数之后是 12 字节字段。在字段之后,从 TIFF 标头的开头到第一个 IFD 的开头有一个 4 字节的偏移量。该值仅对第 0 个 IFD 有意义。紧随其后的是 IFD 数据部分。

IFD 字段

字段是 IFD 部分的 12 字节子部分。每个字段的前两个字节给出了 Exif 标准中定义的标签 ID。接下来的两个字节给出了字段数据的类型。您将有1 用于byte2 用于ascii3 用于shortuint16),4 用于longuint32)等。完整列表的规范。

以下四个字节可能有点混乱。对于字节数组(asciiundefined types),给出了数组的字节长度。例如,对于 Ascii 字符串:"Exif",计数将为 5,包括空终止符。对于其他类型,这是场分量的数量(例如,4 个短路,3 个有理数)。

在计数之后,我们得到了 4 字节的字段值。但是,如果字段数据的长度超过 4 个字节,它将被存储在 IFD 数据部分中。在这种情况下,该值将是从 TIFF 标头开始到字段数据开始的偏移量。例如,对于longuint32,4 个字节),这将是字段值。对于rational2 x uint32,8 字节),这将是 8 字节字段数据的偏移量。


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

【讨论】:

  • 不确定您的 Exif 规范链接。这是另一个:sno.phy.queensu.ca/~phil/exiftool/TagNames/EXIF.html
  • 谢谢。我修复了规范的链接。
  • 嘿,TIFF 标题段落中的“以及以下重要字节......”是什么意思?您的意思是“四个”字节吗?这是否意味着偏移量可以大到可以编码超过 4 个字节?
  • 是的,应该是 4 个字节。
【解决方案2】:

这是我为修改 exif 标头而编写的一个 php 脚本。

<?php

$full_image_string=file_get_contents("torby.jpg");

$filename="torby.jpg";

if (isset($_REQUEST['filename'])){$filename=$_REQUEST['filename'];}

if (array_key_exists('file', $_REQUEST)) {
    $thumb_image = exif_thumbnail($_REQUEST['file'], $width, $height, $type);
} else {
    $thumb_image = exif_thumbnail($filename, $width, $height, $type);
}
if ($thumb_image!==false) {
    echo $thumb_image;

$thumblen=strlen($thumb_image);

echo substr_count($full_image_string,$thumb_image);

$filler=str_pad("%%%THUMB%%%", $thumblen);

$full_image_string=str_replace($thumb_image,$filler,$full_image_string);

file_put_contents("torby.jpg",$full_image_string);

    exit;
} else {
    // no thumbnail available, handle the error here
    echo 'No thumbnail available';
}
?>

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 2012-02-14
    • 1970-01-01
    • 2013-08-12
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多