【问题标题】:Implementing automatic rotation of JPEG images according to EXIF Orientation in ImageIO pluginImageIO插件中根据EXIF方向实现JPEG图像自动旋转
【发布时间】:2013-06-19 17:18:27
【问题描述】:

背景

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

我不是在问如何实现旋转本身,而是我的问题在于 ImageReader API。对于许多用户来说,只需调用ImageIO.read(myJPEG) 就是他们所做的一切,我认为他们对将图像旋转到正确的方向感到满意。但是,如果您查看ImageReader API,它有许多方法可以获取有关图像的信息和元数据,以及读取像素数据的多种方法。

问题

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

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

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

欢迎来自实现者和 ImageIO 用户的输入和建议! :-)

【问题讨论】:

  • ImgScalr 中有趣的相关问题:github.com/thebuzzmedia/imgscalr/issues/62
  • @SebastienLorber 很有趣。不知道为什么这在 Java 中会变得更加困难或不可靠。但很高兴知道至少对这个特性有一些需求。 :-)

标签: java jpeg exif javax.imageio


【解决方案1】:

为什么不旋转图片的原因

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

旋转图片的原因

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

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

附加功能将是

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

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

【讨论】:

    【解决方案2】:

    鉴于世界上的每个图像阅读器都会自动正确地翻转图像,我敢打赌,几乎每个人都会对这种自动发生的情况感到满意。从某种意义上说,即使图像文件的位图部分表示不同,图像“就是”它的旋转版本。整个文件都是标准的。

    是的,如果 ImageIO.read() 能够,嗯,工作,我会非常高兴。它应该给我一个图像,就像地球上每个已知的观众都会展示的那样。当然,如果有人真的想要,包含一些 API 以原始方式获取它,但默认行为应该是流行的使用模式,并且是有意义的方式。为什么您需要以错误的方向查看它?可能会有一些奇怪的用例,但我敢打赌,与普通用例相比,它们非常罕见。

    知道他们什么时候会在默认的 JDK 中解决这个问题吗?编写我自己的代码来进行自己的旋转以将图像放回 感觉很恶心和错误。

    【讨论】:

    • 感谢您的回答! :-) 我暂时搁置了这个功能,因为似乎没有需求。但我同意,在大多数情况下,您希望它能够正常工作。您会惊讶于有多少读者不进行轮换……
    • @haraldK 会喜欢这个功能。我也在 twelevemonkeys 上开了一个问题 github.com/haraldk/TwelveMonkeys/issues/288
    猜你喜欢
    • 2014-01-03
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2013-10-27
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多