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%のマシンで。しかし、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を常にレジストリに含める必要があります。

4

1 に答える 1

3

最も可能性の高い理由は、CLibJPEGImageReaderを使用しているマシンにJAI ImageIOライブラリがインストールされていることです(http://java.net/projects/jai-imageio)。

他のライブラリが機能しない理由(明らかなことは別として)は、32ビットバージョンのライブラリを64ビットシステムにインストールし、multilibライブラリ(https://wiki.archlinux.org/ )をインストールしていないためです。 index.php / Arch64_FAQ)。

于 2012-10-11T03:48:43.893 に答える