Java ImageIO IIOException:不支持的图像类型?
首次使用Java处理图像,并得到一些未记录得很好的奇怪exception。 这是失败的代码行:
BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));
这一行抛出了一个IIOException,其中不支持的图像类型作为exception消息。 我已经检查并重新检查它实际上是这行抛出exception,File对象是有效的,URL是有效的,而image.jpg
实际上是一个有效的JPG,在其他图像中加载完全正常观众。
我该怎么做才能获得有关此exception性质的更多信息? 这是在Java 7中加载图像的传统方式,还是旧的/弃用方法? 关于这些“不支持的图像类型”exception的信息并不是很多,当然,ImageIO支持JPG!
谢谢你的帮助!
尝试检查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替代品
不幸的是,我遇到了许多违反JPEG文件的标准。 ImageIO特别挑剔,经常拒绝加载图像,这些图像通常由其他软件加载并显然正确显示,对文件格式的检查不太严格。
它不是很漂亮,但一种解决方法是直接使用Oracle VM内部JPEG解码器(com.sun.image.codec.jpeg.JPEGCodec),因为它似乎容忍更多的规格偏差作为ImageIO包装器:
BufferedImage img = JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();
这当然不是一个理想的解决方案,因为使用特定于实现的类会将您锁定到特定的VM供应商并且可能会破坏较新的VM版本,但如果您只在受控环境中使用该软件,则可能优于no解决方案。
另一个选择是使用由Werner Randelshofer编写的.jar:
http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-java-imageio/或Monte Media Library: http : //www.randelshofer.ch/monte/
它看起来非常简单,类似于ImageIO的使用,并且可以在CC许可下使用。
- java sqlexception没有找到合适的驱动程序
- 线程“AWT-EventQueue-0”中的exceptionjava.lang.ClassCastException:javax.swing.JTable
- 显示SQL错误消息
- UnexpectedRollbackException – 完整的场景分析
- 无法弄清楚如何捕获InputMismatchException
- iText Java签名PDF DocumentException:空间不足
- 当访问的属性或方法暂时不可用时抛出什么exception?
- ibatis spring java.lang.NoSuchMethodError com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse
- Hibernate:OutOfMemoryError:PermGen空间