Я согласен с @Jason - проблема в том, что вы создаете (и уничтожаете) 15 миллионов объектов Color.
Однако я не думаю, что одного использования нескольких потоков вам достаточно увеличения производительности, потому что вы по-прежнему будете сильно нагружать память и сборщик мусора, поскольку вы все равно будете создавать и уничтожать 15 миллионов объектов, вы просто будете делать несколько параллельно.
Я думаю, что вы можете как полностью отказаться от создания объектов Color, так и сделать меньше циклов, напрямую используя результат метода BufferedImage
class 'getRGB()
, вместо создания объекта Color. Кроме того, вы можете использовать перегрузку getRGB()
, которая возвращает массив целых чисел, чтобы получить, скажем, ряд пикселей (или более) за раз, чтобы уменьшить количество вызовов, которые вы должны делать внутри l oop. Вы также можете использовать версию setRGB()
, которая принимает массив значений пикселей.
Хитрость заключается в том, чтобы иметь возможность преобразовать значение цвета int в значение серого (или все, что вам нужно сделать) без разделение значений R, G и B или поиск эффективного способа разделения R, G и B - более эффективный, чем создание, использование и уничтожение объекта Color.
Что касается получения значений R, G и B из int, возвращаемого getRGB (), обратите внимание, что документация для Color.getRGB()
гласит:
"Возвращает RGB значение, представляющее цвет в sRGB ColorModel по умолчанию (биты 24-31 - альфа, 16-23 - красный, 8-15 - зеленый, 0-7 - синий). "
После того, как вы получите что работает, вы можете подумать о его распараллеливании.