【问题标题】:javax.imageio.ImageReader loading the same image over and overagainjavax.imageio.ImageReader 一遍又一遍地加载相同的图像
【发布时间】:2013-08-29 21:54:50
【问题描述】:

我有一些代码使用 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,但这似乎有点矫枉过正。有谁知道如何解决这个问题?

【问题讨论】:

  • 1- 关闭您的信息流; 2- 阅读完毕后丢弃阅读器; 3- 每次都要求一个“新”读者。可能无法解决问题,但不会造成伤害......
  • 其实你不需要额外的FileInputStream,直接调用ImageIO.createImageInputStream(file)即可。然后你不必关闭它,它may even be faster 也是。 :-)

标签: java javax.imageio


【解决方案1】:

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

然而,理论上,在每个read 之前/之后在ImageReader 上调用reset() 就足够了。

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2014-02-11
    • 2018-01-16
    • 2022-12-14
    • 2016-12-20
    • 2017-02-15
    相关资源
    最近更新 更多