用于奇数图像类型的 Java JPEG 转换器

标签 java jpeg converter

我有一个程序可以使用 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 ExifFF D8 FF E0 JFIF

最佳答案

FFE0 标记后的第一个字段是长度字段。它是 16 位长的 big endian,包括长度字段的长度,但不包括 FFE0 标记。只需从现有 jpeg 复制 FFE0 标记和相关数据,并将其放入 FFD8 和 FFE1 之间。

根据JFIF标准,JFIF头应该紧跟在SOI(FFD8)之后。每个没有 JFIF header 的 jpeg 基本上都是坏的,因为无法知道使用了什么颜色编码。当然还有 Adob​​e 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/

相关文章:

linux - 如何读取 jpeg 量化表?

perl - ImageMagick 的 Perl API 创建非常大的 JPEG 缩略图

java - 多线程运行时间计算

java - BlazeDS : what ARE those standard security fault codes?

C++ OpenCV imdecode 慢

csv - 如何将 csv 文件编码转换为 utf-8

java - XStream:在我解析时折叠 XML 层次结构

java - 如何在 Java 中将 float 转换为 4 个字节?

java - Java 的 Dependency Walker?

java - 无法找到 ServletContext 中定义的名为 XXX 的 bean 的类 XXX