EXIF 和缩略图
EXIF and thumbnails
我正在开发照片查看器。在这种情况下,我写了一个小的 class 来读取和使用一些 EXIF 数据,例如图像方向。这个class适合阅读。
不过,我会添加一个新选项来旋转照片。我想旋转并写入照片数据本身,而不仅仅是重写方向标签。我已经编写了旋转和保存主 JPEG 图像的代码,并且效果很好。但我还需要旋转 EXIF 数据中包含的缩略图(如果有的话)以保持图像的连贯性。为此,我需要写入EXIF数据,以替换现有的缩略图。
但这提出了一些问题,我很难回答,即:
- EXIF 数据是否可以包含 1 个以上的缩略图?如果可以,一张图片最多可以包含多少个缩略图?
- 缩略图支持哪些格式? (我找到了JPEG和TIFF,还有其他的吗?)
- EXIF 标准是否保证缩略图总是写在后期 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 字节长度,然后是数据。它们几乎可以按任何顺序打包,并且在主图像之前可以出现的标签总数没有硬性限制。
我正在开发照片查看器。在这种情况下,我写了一个小的 class 来读取和使用一些 EXIF 数据,例如图像方向。这个class适合阅读。
不过,我会添加一个新选项来旋转照片。我想旋转并写入照片数据本身,而不仅仅是重写方向标签。我已经编写了旋转和保存主 JPEG 图像的代码,并且效果很好。但我还需要旋转 EXIF 数据中包含的缩略图(如果有的话)以保持图像的连贯性。为此,我需要写入EXIF数据,以替换现有的缩略图。
但这提出了一些问题,我很难回答,即:
- EXIF 数据是否可以包含 1 个以上的缩略图?如果可以,一张图片最多可以包含多少个缩略图?
- 缩略图支持哪些格式? (我找到了JPEG和TIFF,还有其他的吗?)
- EXIF 标准是否保证缩略图总是写在后期 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 字节长度,然后是数据。它们几乎可以按任何顺序打包,并且在主图像之前可以出现的标签总数没有硬性限制。