Я предполагаю, что все это потому, что изображение
хранится в оперативной памяти как сырой RGB
данные, не сжатые или оптимизированные в
любым способом.
Точно ... Допустим, JPG 1920x1200 может уместиться, скажем, в 300 КБ, находясь в памяти, в (типичном) RGB + альфа, 8 бит на компонент (следовательно, 32 бита на пиксель), который он должен занимать в памяти:
1920 x 1200 x 32 / 8 = 9 216 000 bytes
так что ваш файл размером 300 КБ становится изображением, требующим почти 9 МБ ОЗУ (обратите внимание, что в зависимости от типа изображений, которые вы используете из Java, а также в зависимости от JVM и ОС, это иногда может быть ОЗУ GFX-карты).
Если вы хотите использовать изображение в качестве фона рабочего стола 1920x1200, вам, вероятно, не нужно иметь изображение большего размера, чем в памяти (если вы не хотите какого-либо специального эффекта, такого как прореживание суб-rgb / цветное изображение) -смазывание / и т. д.).
Итак, вам нужно сделать выбор:
- делает ваши файлы менее широкими и менее высокими (в пикселях) на диске
- уменьшить размер изображения на лету
Обычно я использую цифру 2, потому что уменьшение размера файла на жестком диске означает, что вы теряете детали (картинка 1920x1200 менее детализирована, чем «та же» при 3940x2400: вы будете «терять информацию», уменьшая ее размер).
Теперь Java отстает от большого количества манипуляций с такими большими изображениями (как с точки зрения производительности, с точки зрения использования памяти, так и с точки зрения качества [*]). В те дни я вызывал ImageMagick из Java, чтобы сначала изменить размер изображения на диске, а затем загрузить измененное изображение (скажем, в соответствии с размером моего экрана).
В настоящее время существуют Java-мосты / API для прямого взаимодействия с ImageMagick.
[*] Существует NO WAY Вы сокращаете изображение с помощью встроенного API Java так же быстро и с качеством, аналогичным тому, которое обеспечивает ImageMagick, для начала.