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%のマシンで。しかし、1台のマシンでは、次の出力が生成されます。
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レジストリの最初のImageReaderを使用してラスターを読み取ることになっていることです。しかし残念ながら、1台のPCでは最初のImageReaderはCLibJPEGImageReaderです。JDKとクラスパスは同一であるため、プラグイン付きのjarをクラスパスに配置するだけでImageIOに表示される場合は、CLibJPEGImageReaderを常にレジストリに含める必要があります。