第一次使用Java处理图像,并得到一些未记录得很好的奇怪异常。这是失败的代码行:
BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));
此行抛出了一个IIOException,其中 Unsupported image type 作为异常消息。我已经检查并重新检查它实际上是这行抛出异常,File对象是有效的,URL是有效的,image.jpg
实际上是一个有效的JPG加载完全正常其他形象观众。
如何获取有关此异常性质的更多信息,我该怎么办?这是在Java 7中加载图像的传统方式,还是旧的/弃用方法?关于这些“不支持的图像类型”例外情况并不是很多,当然,ImageIO支持JPG!
感谢您的帮助!
答案 0 :(得分:32)
尝试检查JPEG的编码。例如,ImageIO
无法读取CMYK编码的jpeg图像。
AFAIK,ImageIO多年未更新,因此您不妨尝试使用官方替代/扩展程序:JAI ImageIO。
不可思议的是,JAI ImageIO需要在JRE中安装一些本机库,这可能是不需要的。 我们执行以下操作:
JPEGCodec
:JPEGCodec.createJPEGDecoder(...)
BufferedImage
的栅格并手动转换它(您可以使用ICC配置文件,但手动转换符合我们的需求)。这是我的一个问题,因为ImageIO
不支持所有类型的JPEG图像这一事实,而且我还说明了为什么你得到这个信息的一些结果:{{3} }
答案 1 :(得分:11)
我很遗憾地遇到了许多违反JPEG文件的标准。 ImageIO特别挑剔,经常拒绝加载图像,这些图像通常由其他软件加载并显然正确显示,对文件格式的检查不太严格。
它不是很漂亮,但一种解决方法是直接使用Oracle VM内部JPEG解码器(com.sun.image.codec.jpeg.JPEGCodec),因为它似乎容忍更多规格偏差作为ImageIO包装器:
BufferedImage img =
JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();
这当然不是一个理想的解决方案,因为使用特定于实现的类会将您锁定到特定的VM供应商,并且可能会破坏较新的VM版本,但如果您只在受控环境中使用该软件,则可能是总比没有解决方案好。
答案 2 :(得分:3)
要使用特定格式的图像,您需要添加相应的依赖项,例如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>
内置的ImageIO Java API在运行时自动加载插件。
答案 3 :(得分:1)
另一个选择是使用由Werner Randelshofer准备的.jar:
http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-java-imageio/或蒙特媒体图书馆:http://www.randelshofer.ch/monte/
它看起来非常简单,类似于ImageIO的使用,并且可以在CC许可下使用。