Java ImageIO IIOException:不支持的图像类型?

IAm*_*aja 29 java image exception javax.imageio

首次使用Java处理图像,并得到一些未记录得很好的奇怪异常.这是失败的代码行:

BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));
Run Code Online (Sandbox Code Playgroud)

这一行抛出了一个IIOException,其中不支持的图像类型作为异常消息.我检查并重新检查它实际上是这行引发异常,File对象是有效的,URL是有效的,并且image.jpg实际上是一个有效的JPG,在其他图像查看器中加载完全正常.

我该怎么做才能获得有关此异常性质的更多信息?这是在Java 7中加载图像的传统方式,还是旧的/弃用方法?关于这些"不支持的图像类型"异常的信息并不是很多,当然,ImageIO支持JPG!

谢谢你的帮助!

Tho*_*mas 33

尝试检查JPEG的编码.ImageIO例如,无法读取CMYK编码的jpeg图像.AFAIK,ImageIO多年来一直没有更新,所以你想尝试使用官方替代/扩展:JAI ImageIO.

不可思议的是,JAI ImageIO需要在JRE中安装一些本机库,这可能是不需要的.我们执行以下操作:

  • 使用Apache Sanselan来检测它是否是JPEG
  • 由于Sanselan无法读写JPEG,请使用普通的旧AWT JPEGCodec:JPEGCodec.createJPEGDecoder(...)
  • 要将CMYK转换为RGB,我们然后获取读取的栅格BufferedImage并手动转换它(您可以使用ICC配置文件,但手动转换符合我们的需求)

这是我的一个问题,因为ImageIO它不支持所有类型的JPEG图像,而且我还说明了为什么你得到这个信息的一些结果:用于检测CMYK图像的JAI ImageIO的纯Java替代品


jar*_*bjo 11

不幸的是,我遇到了许多标准违反JPEG文件.ImageIO特别挑剔,经常拒绝加载图像,这些图像通常由其他软件加载并显然正确显示,对文件格式的检查不太严格.

它不是很漂亮,但一种解决方法是直接使用Oracle VM内部JPEG解码器(com.sun.image.codec.jpeg.JPEGCodec),因为它似乎容忍更多的规格偏差作为ImageIO包装器:

BufferedImage img = 
    JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();
Run Code Online (Sandbox Code Playgroud)

这当然不是一个理想的解决方案,因为使用特定于实现的类会将您锁定到特定的VM供应商,并且可能会破坏较新的VM版本,但如果您只在受控环境中使用该软件,则可能优于no解决方案.


May*_*yen 7

要处理特定格式的图像,您需要添加相应的依赖项,例如 imageio-jpeg 或 imageio-tiff:

<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.3.2</version>
</dependency>

<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-bmp</artifactId>
<version>3.3.2</version>
</dependency>

<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-core</artifactId>
<version>3.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

内置的 ImageIO Java API 在运行时自动加载插件。