在 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 可见。