根据ImageIO插件中的EXIF方向实现JPEG图像的自动旋转

时间:2013-06-22 19:24:07

标签: java jpeg exif javax.imageio

背景

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

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

问题

我是否应该使用ImageReadParam公开一种方法来读取文件中的数据(我可以反过来做,但这不允许上面提到的常见情况具有以下优点:功能)?

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

...或者可选地,我应该放弃它,并留给客户阅读EXIF元数据,并在需要时自行应用轮换?

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

2 个答案:

答案 0 :(得分:2)

不旋转图像的原因

  • 方向存储在Exif元数据中,不属于JPEG / JFIF标准
  • 阅读Exif元数据会增加额外的复杂性
  • 如果Exif元数据错误,您可能会错误
  • 如果将Exif元数据包含在修改后的文件中,则必须对其进行修改。
  • 在cpu加载和内存方面,旋转图像可能成本很高
  • 如果您阅读了瓷砖,则显示未定义的行为

旋转图片的原因

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

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

其他功能将是

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

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

答案 1 :(得分:1)

鉴于世界上的每个图像阅读器都能自动地正确地翻转图像,我敢打赌,几乎每个人都可以自动完成这种情况。从某种意义上说,图像"是"即使图像文件的位图部分说不同,它的旋转版本也是如此。整个文件是标准。

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

有什么想法,他们将在默认的JDK中解决这个问题?编写我自己的代码来进行自己的轮换以使图像回来感到恶心和错误。