1

在 jar jai_imageio.jar 中有类:

com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader

所以我将 jai_imageio.jar(和 jai_core.jar、jai_codec.jar)添加到类路径中。但是 ImageIO 似乎无法访问此类。所以这段代码:

ImageIO.scanForPlugins();
IIORegistry.getDefaultInstance().registerApplicationClasspathSpis();
Iterator<ImageReader> ir = ImageIO.getImageReadersByFormatName("jpeg");
while(ir.hasNext()) {
    ImageReader r = ir.next();
    System.out.println("can read raster: " + r.canReadRaster());
    System.out.println(r);
}

结果如下输出:

can read raster: true
com.sun.imageio.plugins.jpeg.JPEGImageReader@54520eb

在 99% 的机器上。但在一台机器上,它会产生以下输出:

Can read raster: false
com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader@163e9a1
Can read raster: true
com.sun.imageio.plugins.jpeg.JPEGImageReader@10cecb2

为什么会发生?我应该做更多的事情,只是将带有 ImageIO 插件的 jar 放在类路径上吗?我可以以某种方式从 ImageIO-Registry 卸载 ImageReader 吗?

背景

实际上我的问题是一些外部不可更改的代码应该使用 ImageIO Registry 中的第一个 ImageReader 来读取光栅。但不幸的是,在一台 PC 上,第一个 ImageReader 是 CLibJPEGImageReader。JDK 和类路径是相同的,因此 CLibJPEGImageReader 应该始终在注册表中,如果在类路径上放置一个带有插件的 jar 足以使其对 ImageIO 可见。

4

1 回答 1

3

最可能的原因是您使用 CLibJPEGImageReader 的机器安装了 JAI ImageIO 库 ( http://java.net/projects/jai-imageio )。

为什么其他不起作用(除了显而易见的)是因为您在 64 位系统上安装了 32 位版本的库,而没有安装 multilib 库(https://wiki.archlinux.org/ index.php/Arch64_FAQ)。

于 2012-10-11T03:48:43.893 回答