从jar添加/删除ImageReader到ImageIO-registry

时间:2012-08-16 11:13:57

标签: java javax.imageio jai

在jar jai_imageio.jar中有class:

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

所以我将jai_imageio.jar(和jai_core.jar,jai_codec.jar)添加到classpath。但是这个类似乎无法访问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放在classpath上?我可以以某种方式从ImageIO-Registry卸载ImageReader吗?

背景

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

1 个答案:

答案 0 :(得分:3)

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

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