EXIF 和缩略图

问题描述 投票:0回答:1

我正在研究照片查看器。在这种情况下,我写了一个小类来读取和使用一些 EXIF 数据,例如图像方向。这门课很适合阅读。

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

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

  • EXIF 数据是否可以包含超过 1 个缩略图,如果是,一张图像可以包含的最大缩略图数量是多少?
  • 缩略图支持哪些格式? (我找到了 JPEG 和 TIFF,还有其他的吗?)
  • EXIF 标准是否保证缩略图总是写在后期 EXIF 数据中,就在主图像之前?
  • 如果不是,则应更新每个包含指向缩略图之外要替换位置的偏移量的标签。那么,有没有一种标准的方法来遍历所有标签和子目录,识别哪些 EXIF 标签包含偏移量,并在需要时更新它们?或者是读取最大数量的标签并仅重写已知标签的唯一方法?
  • 或者有没有办法保证新旋转的缩略图的大小会小于或等于以前的缩略图大小来替换?
image jpeg exif
1个回答
11
投票

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

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

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

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

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

5) 只要你使 EXIF APP1 标签数据的总大小在 64k 以内,你就可以对缩略图的大小/方向做任何你想做的事。

这是你需要做的...

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

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

© www.soinside.com 2019 - 2024. All rights reserved.