我一直在研究用于读取JPEG的ImageIO插件。我想要实现的功能之一是根据EXIF / TIFF方向标记自动旋转图像(如果存在)。
我不是问如何实现旋转本身,而是我的问题是使用ImageReader API。对于许多用户来说,只需拨打ImageIO.read(myJPEG)
就可以了,我认为他们很高兴将图像旋转到正确的方向。但是,如果查看ImageReader
API,它有很多方法可以获取有关图像的信息和元数据,还有各种方法来读取像素数据。
我是否应该使用ImageReadParam
公开一种方法来读取文件中的数据(我可以反过来做,但这不允许上面提到的常见情况具有以下优点:功能)?
我正在处理元数据支持(如IIOMetadata
),如果元数据报告方向标记写在文件中,或更新以反映旋转的图像?这就是我觉得事情崩溃的地方......这里真正的问题是,当有人读取图像和元数据时,会对图像进行一些操作并再次使用元数据存储它(如果编写者然后进行相反的旋转,或者“神奇地”丢弃方向标签并用w / h更新?
...或者可选地,我应该放弃它,并留给客户阅读EXIF元数据,并在需要时自行应用轮换?
欢迎来自实施者和ImageIO用户的意见和建议! : - )
答案 0 :(得分:2)
不旋转图像的原因
旋转图片的原因
我认为ImageIO应该旋转图像并更新Exif。这样开发人员可以使用ImageIO而无需担心图像文件格式。并且新JPEGReader的行为与旧的JPEGReader兼容。
其他功能将是
我认为我们应该抛弃过去(Exif不是标准)并考虑Exif中的方向是JPEG的一部分。但我认为在将像素放入内存或屏幕时,我们仍应忽略所有其他Exif信息; - )
答案 1 :(得分:1)
鉴于世界上的每个图像阅读器都能自动地正确地翻转图像,我敢打赌,几乎每个人都可以自动完成这种情况。从某种意义上说,图像"是"即使图像文件的位图部分说不同,它的旋转版本也是如此。整个文件是标准。
是的,如果ImageIO.read()只是,嗯,工作,我会非常高兴。它应该给我一个像这个星球上每个已知观众所展示的图像。当然,如果有人真的想要的话,请包含一些API来获取原始方式,但默认行为应该是流行的使用模式,以及有意义的方式。为什么你需要以错误的方向查看它?可能有奇怪的用例,但我敢打赌,与普通用例相比,它们非常罕见。
有什么想法,他们将在默认的JDK中解决这个问题?编写我自己的代码来进行自己的轮换以使图像回来感到恶心和错误。