EXIF 和缩略图

EXIF and thumbnails

我正在开发照片查看器。在这种情况下,我写了一个小的 class 来读取和使用一些 EXIF 数据,例如图像方向。这个class适合阅读。

不过,我会添加一个新选项来旋转照片。我想旋转并写入照片数据本身,而不仅仅是重写方向标签。我已经编写了旋转和保存主 JPEG 图像的代码,并且效果很好。但我还需要旋转 EXIF 数据中包含的缩略图(如果有的话)以保持图像的连贯性。为此,我需要写入EXIF数据,以替换现有的缩略图。

但这提出了一些问题,我很难回答,即:

此致

以下是您问题的一些答案:

1) EXIF 数据的布局类似于 2 页的 TIFF 文件。第一页是相机信息,第二页是缩略图。如果您添加更多页面(带有缩略图),99.99% 的应用程序可能不会注意到,因为您将以不同于 "standard" 的方式进行操作。至于 "maximum count",您有 64k 的数据可以存储在任何 JFIF 标记中。你可以把你想要的东西放在那个64k里。

2) 仅支持 1 种 EXIF 缩略图格式:TIFF。在 TIFF 中可以有压缩 (JPEG) 或未压缩的数据。同样,欢迎您将 LZW 压缩数据粘贴到其中,但大多数应用程序可能不会准备好正确显示它。

3) JFIF 容器格式允许带有元数据的标签出现在主图像之前。 APPx 标签包含可以遵循或不遵循标准的元数据。欢迎您将多个 EXIF APP1 标签粘贴到您的文件中,但同样,大多数应用程序将无法正确处理这种情况。所以简单的答案是 EXIF 数据(包括缩略图)必须在主图像之前,如果你放置超过 1 个缩略图,它很可能会被忽略。

4) 如果您正在修改 JFIF(包括元数据),则必须重写元数据。其实很简单,因为每个标签都是独立的,有一个简单的长度值,而不是相对偏移量。

5) 你可以用缩略图的size/orientation做任何你想做的事情,只要你让EXIF APP1标签数据总大小在64k以内。

这是您需要做的...

1) 读取源图像(如果存在缩略图)。
2) 准备旋转后的图像(和缩略图)。
3) 用新的缩略图写入新的元数据。
4) 写入新主图

如果您想在保留新缩略图的同时保留原始元数据,这非常简单。只需阅读原始标签并保留它们,然后将它们写在新图像中。每个 JFIF 标记只是一个 2 字节标识符 (FFxx),后跟 2 字节长度,然后是数据。它们几乎可以按任何顺序打包,并且在主图像之前可以出现的标签总数没有硬性限制。