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 JPEGCodecJPEGCodec.createJPEGDecoder(...)
  • 将CMYK转换为RGB,然后我们获取读取的栅格BufferedImage并进行手动转换(您可以使用ICC配置文件,但是手动转换符合我们的需求)