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);
}

大约四分之一的情况下,ImageReader 会“卡在”它加载的第一个图像上,并一遍又一遍地加载相同的图像,即使它提供了不同的 ImageInputStreams。记录器的输出证明了这一点。

我该如何解决这个问题。如果发生这种情况,我正在考虑获取图像的“指纹”并从迭代器中获取不同的 ImageReader ,但这似乎有点矫枉过正。有谁知道如何解决这个问题?

4

1 回答 1

2

正如@MadProgrammer 在评论部分所说,读取多个图像的典型模式是ImageReader为每个图像获取一个新图像,然后再获取dispose()它。与实际读取图像相比,创建读取器实例所花费的时间/内存非常小。因此,任何性能损失都应该可以忽略不计。

然而,理论上它应该足以reset()ImageReaderbefore/after each上调用read

于 2013-08-30T14:49:08.437 回答