第一次在Java中处理图像,并且得到了一些奇怪的异常,这些异常并没有得到很好的记录。下面是失败的代码行:
BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));这一行是抛出一个不受支持的图像类型的IIOException作为异常消息。我检查并重新检查了以下内容:实际上是这一行抛出异常,File是有效的,URL是有效的,而image.jpg实际上是一个有效的JPG,在其他图像查看器中加载得非常好。
我能做些什么来获得更多关于这个异常性质的信息呢?这是在Java 7中加载图像的传统方式,还是一种旧的/不推荐的方法?关于这些“不受支持的图像类型”异常,这里没有太多的信息,当然,ImageIO支持JPG!
谢谢你的帮助!
发布于 2011-08-24 15:03:46
尝试检查JPEG的编码。例如,ImageIO无法读取CMYK编码的jpeg图像。AFAIK,ImageIO已经很多年没有更新了,所以您想尝试使用官方的替代/扩展:JAI ImageIO。
不巧的是,JAI ImageIO需要安装到JRE中的一些本机库,这可能是不必要的。我们做了以下工作:
JPEGCodec:JPEGCodec.createJPEGDecoder(...)BufferedImage的光栅并手动转换它(您可以使用ICC配置文件,但手动转换符合我们的需要)下面是我的一个问题,这是因为ImageIO不支持所有类型的JPEG图像,我在这里更多地说明了我对为什么会收到这样的信息的发现:用纯Java替代JAI ImageIO检测CMYK图像
发布于 2011-08-24 15:08:16
不幸的是,我遇到了很多违反JPEG文件的标准。ImageIO特别挑剔,并且经常拒绝加载图像,这些图像通常被加载,并且显然被其他软件正确显示,而对文件格式的检查则不那么严格。
这不是很漂亮,但解决方法之一是直接使用Oracle内部JPEG解码器(com.sun.image.codec.jpeg.JPEGCodec),因为它似乎可以容忍更多的规范偏差,如ImageIO包装:
BufferedImage img = 
    JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();这当然不是一个理想的解决方案,因为使用特定的实现类会将您锁定到特定的VM供应商,并且可能会与较新的VM版本中断,但是如果您只在受控环境中使用该软件,它可能比根本没有解决方案好。
发布于 2020-10-16 15:45:18
要处理特定格式的图像,需要添加相应的依赖项,例如imageio或imageio:
<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在运行时自动加载插件。
https://stackoverflow.com/questions/7177655
复制相似问题