Как вы получаете displayImage
и что ColorModel
он использует?
Если это IndexColorModel
, это может многое объяснить.
Первый фрагмент кода вернет BufferedImage
, используя DirectColorModel
. Это потребует 4 байта на пиксель по сравнению с обычно 1 байтом на пиксель для индексированного изображения. Это расширение 1: 4 может быть причиной вашей нехватки памяти.
Второй фрагмент кода создает BufferedImage
с той же моделью, что и источник. Когда это IndexColorModel
и интерполяция не NEAREST_NEIGHBOR
, вызов filter()
создаст временный BufferedImage
с DirectColorModel
. Он будет использовать его в качестве места назначения операции фильтрации, затем повторно закроет временный буфер и поместит его в ваш displayImage2
. Итак, в два раза больше битблитов.
Если вы выполняете только одно преобразование, я бы сказал, перейдите ко второй форме.
Если вы выполняете несколько операций, выделите пару BufferedImage
с DirectColorModel
. достаточно большой, чтобы вместить ваше самое большое изображение. Нарисуйте исходное изображение в одном из них и выполняйте фильтры вперед и назад между ними. Затем, когда вы закончите, используйте ColorConvertOp
, чтобы перекодировать обратно в индексированное изображение. Таким образом, вам нужно преобразовывать цвета только один раз, а не при каждом вызове фильтра.