Java ImageIO IIOException:不支持的图像类型?
问题内容:
第一次使用Java处理图片,并且遇到了一些未得到很好记录的怪异异常。这是失败的代码行:
BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));
此行将抛出带有 不支持的图像类型 的IIOException
作为异常消息。我检查并重新检查了这行实际上是否引发了异常,File对象有效,URL有效以及image.jpg
实际上是有效的JPG,该JPG在其他图像查看器中完全可以正常加载。
我应该怎么做才能获得有关此异常性质的更多信息?这是在Java
7中加载图像的传统方式,还是旧的/过时的方法?关于这些“不受支持的图像类型”异常的信息不多,当然,ImageIO支持的JPG!
谢谢你的帮助!
问题答案:
尝试检查JPEG的编码。ImageIO
例如,无法读取CMYK编码的jpeg图像。AFAIK,ImageIO已有多年未更新,因此您想尝试使用官方替代/扩展名:JAIImageIO。
不幸的是,JAI ImageIO需要将某些本机库安装到JRE中,这可能是不需要的。我们执行以下操作:
- 使用Apache Sanselan来检测是否为JPEG
- 由于Sanselan无法读取和写入JPEG,请使用普通的旧AWT
JPEGCodec
:JPEGCodec.createJPEGDecoder(...)
- 将CMYK转换为RGB,然后我们获取读取的栅格
BufferedImage
并进行手动转换(您可以使用ICC配置文件,但是手动转换符合我们的需求)