Java 读取jpeg图片 Unsupported Image Type 异常

使用Java的ImageIO做一些图片处理的工作,突然今天有人反馈说我的程序无法处理jpg图片。我拿到图片进行调试,出现了如下报错:

 

javax.imageio.IIOException: Unsupported Image Type

       at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)

       at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)

       at javax.imageio.ImageIO.read(Unknown Source)

       at javax.imageio.ImageIO.read(Unknown Source)

       at com.dancen.util.image.MyImageHelper.getBufferedImage(MyImageHelper.java:554)

 

也就是说,这个jpg图片被认为是不支持的图片类型,然而,程序却能够正常处理其它的jpg图片。

难道这个图片不是一张jpg图片?使用系统自带的图片浏览工具、使用浏览器都能正常显示该图片;而且该文件的文件头FFD8FF确实也表明这就是一张jpg图片。

 

问题原因:

Java的ImageIO万年不更新,已经跟不上时代,它不能处理CMYK色彩的图片。如果在PS等软件中导出CMYK颜色模式的图片,Java自带的ImageIO是不支持的。

 

解决办法:

TwelveMonkeys项目:https://github.com/haraldk/TwelveMonkeys

TwelveMonkeys ImageIO is a collection of plugins and extensions for Java's ImageIO.

 

These plugins extends the number of image file formats supported in Java, using the javax.imageio.* package. The main purpose of this project is to provide support for formats not covered by the JRE itself.

 

Support for formats is important, both to be able to read data found "in the wild", as well as to maintain access to data in legacy formats. Because there is lots of legacy data out there, we see the need for open implementations of readers for popular formats. The goal is to create a set of efficient and robust ImageIO plug-ins, that can be distributed independently.

 

TwelveMonkeys ImageIO是Java ImageIO的扩展,在使用上非常方便,直接导入相关的jar包依赖即可,不需要在原有代码上进行修改,代码上层依然使用的是Java的ImageIO。

 

附:RGB色彩和CMYK色彩的区别和换算

RGB色彩

 

自然界中绝大部分的可见光谱可以用红、绿和蓝三色光按不同比例和强度的混合来表示。RGB分别代表着3种颜色:R代表红色,G代表绿色、B代表蓝色。RGB模型也称为加色模型,通常用于光照、视频和屏幕图像编辑。RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。

 

CMYK色彩

 

CMYK色彩模式以打印油墨在纸张上的光线吸收特性为基础,图像中每个像素都是由靛青(C)、品红(M)、黄(Y)和黑(K)色按照不同的比例合成。每个像素的每种印刷油墨会被分配一个百分比值,最亮(高光)的颜色分配较低的印刷油墨颜色百分比值,较暗(暗调)的颜色分配较高的百分比值。

 

CMYK转RGB的换算方法

 

R = 255*(100-C)*(100-K)/10000

G = 255*(100-M)*(100-K)/10000

B = 255*(100-Y)*(100-K)/10000

1

2

3

RGB转CMYK的换算方法

这个转换理论上是不存在的,主要是因为K值的存在。当k=0时的公式为:

C = 100 - R * 100 / 255

M = 100 - G * 100 / 255

Y = 100 - B * 100 / 255