2013-08-29 2 views
1

У меня есть код, который использует класс ImageReader для чтения в большом количестве изображений TIF. Объект imageReader является окончательным и создается в конструкторе.javax.imageio.ImageReader загружает одно и то же изображение поверх и overagain

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

1- Закрыть ваши потоки; 2- Утилизируйте читателя после того, как вы закончите чтение; 3. Просите «нового» читателя каждый раз. Может не решить проблему, но не помешает ... – MadProgrammer

+0

На самом деле вам не нужен дополнительный 'FileInputStream', просто вызовите' ImageIO.createImageInputStream (файл) 'напрямую. Тогда вам не нужно закрывать его, и он [может быть даже быстрее] (http://stackoverflow.com/questions/18522398/fastest-way-to-read-write-images-from-a-file-into -abufferedimage/18534396 # 18534396) тоже. :-) – haraldK

ответ

2

Как поясняет @MadProgrammer в разделе комментариев, типичным образцом для считывания нескольких изображений является получение нового ImageReader для каждого изображения, а затем dispose(). Время/память, потраченные на создание экземпляра считывателя, очень малы по сравнению с фактическим чтением изображения. Поэтому любой штраф за исполнение должен быть незначительным.

Теоретически этого должно быть достаточно, чтобы вызвать reset() на ImageReader до/после каждого read.

Смежные вопросы