我有一个程序可以使用 mortennobel 图像库来重新缩放图像以用于重新缩放过滤器/算法。我正在使用 Java 标准库 ImageIO 将文件读入 BufferedImage
对象。然而,我遇到的问题是 ImageIO 库只接受标准形式的图像,所以如果 ImageIO.read()
函数抛出 IOException
我想捕获它并将图像转换为标准格式,例如 JPEG。
澄清一下,我遇到的问题是一些图像不是标准的 JPEG 格式,即 FF D8 FF E0 JFIF
,而是由数码相机或在 photoshop 中编辑,格式为 FF D8 FF E1 Exif
。可以通过将图像加载到像画图这样的程序中并再次保存为 JPEG 来更改此格式,但这对我的情况来说并不理想,因为我希望它是自动化的。
转换自:FF D8 FF E1 Exif
到 FF D8 FF E0 JFIF
最佳答案
FFE0 标记后的第一个字段是长度字段。它是 16 位长的 big endian,包括长度字段的长度,但不包括 FFE0 标记。只需从现有 jpeg 复制 FFE0 标记和相关数据,并将其放入 FFD8 和 FFE1 之间。
根据JFIF标准,JFIF头应该紧跟在SOI(FFD8)之后。每个没有 JFIF header 的 jpeg 基本上都是坏的,因为无法知道使用了什么颜色编码。当然还有 Adobe jpeg,但它们并不重要。如果有 JFIF header ,您就知道图像是用 YCbCr 编码的。如果没有 JFIF header ,您可能会认为它是 YCbCr,但您不能确定。
您可以在此处阅读有关 JFIF 标准的更多信息:http://www.w3.org/Graphics/JPEG/jfif3.pdf
关于用于奇数图像类型的 Java JPEG 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676701/