4

背景

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

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

问题

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

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

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

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

4

2 回答 2

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 信息;-)

于 2016-02-04T11:40:56.267 回答
4

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

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

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

于 2014-03-31T23:08:51.503 回答