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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
javax.imageio.iioexception: unsupported image typeJava图像输入输出异常的一种,表示不支持或不识别的图像类型。 在Java中,javax.imageio包提供了许多用于读取、写入和操作图像的类和接口。当使用该包中的类进行图像操作时,如果遇到不支持或不识别的图像类型,就会抛出javax.imageio.iioexception: unsupported image type异常。 造成这个异常的原因可能有以下几种情况: 1. 图片格式不受支持:Java的图像处理库支持许多常见的图片格式,如JPEG、PNG、GIF等。如果使用的图片格式不在支持列表中,就会抛出该异常。 2. 图片文件内容损坏:有时候由于网络传输、存储介质损坏或其他原因,图片文件的内容会发生损坏。如果图片文件的内容损坏,读取时就会抛出该异常。 3. 图片文件扩展名错误:某些情况下,Java的图像处理库根据文件的扩展名猜测图片的格式。如果文件扩展名与实际图片格式不匹配,也会导致该异常的发生。 解决javax.imageio.iioexception: unsupported image type异常的方法有: 1. 使用支持的格式:确认所处理的图片格式是Java图像处理库支持的,如果不是,则需将其转换为支持的格式再进行处理。 2. 检查图片文件:检查图片文件是否存在并且没有损坏。可以尝试打开图片文件并查看是否能正常显示。 3. 确认文件扩展名:确保文件的扩展名与实际的图片格式匹配。在加载图片时,可以指定图片的格式,而不依赖于文件扩展名。 总之,javax.imageio.iioexception: unsupported image type异常通常是由不支持或不识别的图像类型引起的。通过检查图片格式、文件内容和文件扩展名等方面的问题,可以解决该异常

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值