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

新手上路,请多包涵

第一次使用 Java 处理图像,遇到了一些没有很好记录的奇怪异常。这是失败的代码行:

 BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));

此行抛出一个带有 Unsupported image type 作为异常消息的 IIOException。我检查并重新检查实际上是这一行抛出异常,File 对象有效,URL 有效,并且 image.jpg 实际上是一个有效的 JPG,可以完美加载在其他图像查看器中很好。

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

谢谢你的帮助!

原文由 IAmYourFaja 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

尝试检查 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 图像这一事实导致的,我在那里陈述了一些关于为什么你会收到该消息的发现: Pure Java alternative to JAI用于检测 CMYK 图像的 ImageIO

原文由 Thomas 发布,翻译遵循 CC BY-SA 4.0 许可协议

不幸的是,我遇到过很多违反标准的 JPEG 文件。 ImageIO 特别挑剔,经常拒绝加载图像,而这些图像通常被其他软件加载并显然正确显示,但对文件格式的检查不那么严格。

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

 BufferedImage img =
    JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();

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

原文由 jarnbjo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题