EXIF和缩略图

Jea*_*ond 4 jpeg exif image

我正在拍摄照片查看器.在这种情况下,我写了一个小类,以便能够读取和使用一些EXIF数据,例如图像方向.这门课程适合阅读.

但是,我会添加一个新选项来旋转照片.我想旋转并写入照片数据本身,而不仅仅是重写方向标签.我已经编写了代码来旋转并保存主JPEG图像,它运行良好.但是我还需要旋转EXIF数据中包含的缩略图(如果有的话),以保持图像的连贯性.出于这个原因,我需要写入EXIF数据,以替换现有的缩略图.

但这提出了一些问题,我在回答时遇到了一些麻烦,即:

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

问候

Bit*_*ank 8

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

1)EXIF数据的布局类似于2页的TIFF文件.第一页是相机信息,第二页是缩略图.如果您添加更多页面(使用缩略图),99.99%的应用程序可能不会注意到,因为您将采用与"标准"方式不同的方式.就"最大计数"而言,您有64k的数据可以存储在任何JFIF标签中.你可以把你想要的东西放在64k里.

2)只有一种支持的EXIF缩略图格式:TIFF.在TIFF内部可以有压缩(JPEG)或未压缩的数据.同样,欢迎您将LZW压缩数据放在那里,但大多数应用程序可能无法正确显示它.

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

4)如果要修改JFIF(包括元数据),则必须重写元数据.它实际上非常简单,因为每个标签都是独立的,并且具有简单的长度值而不是相对偏移.

5)只要您将EXIF APP1标签数据的总大小设置在64k以内,您就可以使用缩略图的大小/方向执行任何操作.

这是你需要做的......

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

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

  • @haraldK感谢doc链接.我提到LZW的观点是他想要做一些超出标准的事情,所以如果他不遵循标准,他可以自由地提出他想要的任何类型的数据. (2认同)