在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可见。
答案 0 :(得分:3)
最可能的原因是你正在使用CLibJPEGImageReader的机器安装了JAI ImageIO库(http://java.net/projects/jai-imageio)。
为什么其他的不工作(除了显而易见的)是因为你在64位系统上安装了32位版本的库而没有安装multilib库(https://wiki.archlinux.org/index.php/Arch64_FAQ)。