1

ImageReader クラスを使用して多数の TIF 画像を読み込むコードがあります。imageReaderオブジェクトは最終的なものであり、コンストラクターで作成されます。

synchronized(imageReader) {
    LOG.debug(file);
    FileInputStream fin = new FileInputStream(file);
    ImageInputStream iis = ImageIO.createImageInputStream(fin);
    imageReader.setInput(iis, false);
    int sourceXSubSampling = targetSize == null ?
            1 : Math.max(1, imageReader.getWidth(0) / targetSize.width);
    int sourceYSubSampling = targetSize == null ?
            1 : Math.max(1, imageReader.getHeight(0) / targetSize.height);
    ImageReadParam subSamplingParam = new ImageReadParam();
    subSamplingParam.setSourceSubsampling(sourceXSubSampling, sourceYSubSampling, 0, 0);
    return imageReader.read(0, subSamplingParam);
}

約 4 分の 1 のインスタンスは、ImageReader がロードした最初のイメージで「スタック」し、異なる ImageInputStreams が提供されているにもかかわらず、同じイメージを何度もロードし続けます。これは、ロガーへの出力によって証明されます。

どうすればこれを解決できますか。これが発生した場合、画像の「指紋」を取得し、イテレータから別の ImageReader を取得することを考えていましたが、それはやり過ぎのようです。この問題を解決する方法を知っている人はいますか?

4

1 に答える 1

2

@MadProgrammer がコメント セクションで述べているように、複数の画像を読み取るための典型的なパターンは、ImageReader画像ごとに新しい を取得し、その後dispose()それを取得することです。リーダー インスタンスの作成に費やされる時間/メモリは、実際に画像を読み取る場合と比べて非常にわずかです。したがって、パフォーマンスの低下は無視できるはずです。

reset()ただし、理論的には、ImageReaderbefore/after eachで呼び出すだけで十分readです。

于 2013-08-30T14:49:08.437 に答える