ImageIO插件中根据EXIF Orientation实现JPEG图片的自动旋转

har*_*ldK 4 java jpeg exif javax.imageio

背景

我一直在研究用于读取 JPEG 的 ImageIO 插件一段时间。我想要实现的功能之一是根据 EXIF/TIFF 方向标签(如果存在)自动旋转图像。

我不是在问如何实现旋转本身,而是我的问题是 ImageReader API。对于许多用户来说,ImageIO.read(myJPEG)他们所做的只是简单地打电话,我认为他们很高兴将图像旋转到正确的方向。但是,如果您查看ImageReaderAPI,它有许多方法可以获取有关图像的信息和元数据,也有多种方法可以读取像素数据。

问题

我是否应该公开一种方法来读取文件中的数据,使用ImageReadParam(我也可以反过来做,但这不允许上述常见情况受益于该功能)?

我正在研究元数据支持(如IIOMetadata),元数据是否应该报告文件中写入的方向标签,或者更新以反映旋转的图像?这就是我觉得事情崩溃的地方......这里真正的问题是当有人读取图像和元数据时会发生什么,对图像进行一些操作并将其与元数据一起再次存储(如果作者然后进行相反的旋转,或“神奇地”丢弃方向标签并更新 w/h)?

...或者,我是否应该放弃它,让客户读取 EXIF 元数据,并在需要时自行应用轮换?

欢迎来自实施者和 ImageIO 用户的意见和建议!:-)

Tom*_*olk 5

不旋转图像的原因

  • 方向存储在 Exif 元数据中,这不是 JPEG/JFIF 标准的一部分
  • 读取 Exif 元数据会增加额外的复杂性
  • 如果 Exif 元数据错误,您可能会出错
  • 如果将 Exif 元数据包含在修改后的文件中,则必须修改它。
  • 就 CPU 负载和内存而言,旋转图像可能代价高昂
  • 阅读磁贴时的未定义行为

旋转图像的原因

  • Exif 元数据由几乎所有 2010 年以后制造的数码相机写入
  • 大多数数码相机不旋转图像,而仅在元数据中存储方向。可能是因为需要额外的硬件。
  • 由于最后两个原因,可以将 Exif 方向视为标准和必须遵守的信息。
  • 许多非技术用户(如 Web 浏览器)的查看器根据 Exif 旋转图像以提供更好的用户体验。因此,用户会认为不旋转的视图不完整或损坏。
  • 其他元数据信息(如颜色转换)也会在读取过程中应用。

我认为 ImageIO 应该旋转图像并更新 Exif。这样开发人员就可以使用 ImageIO 而不必担心图像文件格式。并且新的 JPEGReader 的行为与旧的兼容。

附加功能将是

  • 提供一种方法来读取未旋转的图像并保持 exif 不变。
  • 提供一种以指定方向写入图像的方法。
  • 我不会让 JPEG 写入根据 Exif 元数据改变其行为,因为 Exif 中可能有很多东西。

我认为我们应该抛开过去(Exif 不是标准),并考虑将 Exif 中的方向作为 JPEG 的一部分。但我认为在将像素放入内存或屏幕时,我们仍然应该忽略所有其他 Exif 信息;-)