我正在拍摄照片查看器.在这种情况下,我写了一个小类,以便能够读取和使用一些EXIF数据,例如图像方向.这门课程适合阅读.
但是,我会添加一个新选项来旋转照片.我想旋转并写入照片数据本身,而不仅仅是重写方向标签.我已经编写了代码来旋转并保存主JPEG图像,它运行良好.但是我还需要旋转EXIF数据中包含的缩略图(如果有的话),以保持图像的连贯性.出于这个原因,我需要写入EXIF数据,以替换现有的缩略图.
但这提出了一些问题,我在回答时遇到了一些麻烦,即:
问候
以下是您的问题的一些答案:
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字节的长度,然后是数据.它们几乎可以按任何顺序打包,并且在主图像之前可以显示的总标签数量没有硬性限制.