Теоретически, большинство форматов изображений можно постепенно уменьшать, не загружая все изображение в память, однако я не знаю каких-либо инструментов, которые действительно реализуют такую функцию, кроме JPEG: это особенность в том, что вы можете не только уменьшать масштаб без загрузки с полным разрешением, но также с уменьшением масштаба без декодирования до полного разрешения благодаря творческому использованию DCT (JPEG кодируется в частотной области, что означает, что его не нужно декодировать с точно таким же разрешением, что и у исходного изображения).
Инструмент декодирования JPEG по умолчанию (командная строка, пакет libjpeg-progs в Linux, ищите djpeg.exe для Windows) уменьшит размер огромного JPEG прежде, чем «обычное» приложение сможет даже завершить его загрузку:
djpeg -scale 1/8 huge_image_that_will_not_fit_in_your_ram.jpg >downscaled.ppm
Я также видел опцию downscale-while-loading в некоторых приложениях с графическим интерфейсом, но пока не могу ее вспомнить.
Benchmark!
Сравнение использования памяти и времени обработки ImageMagick против djpeg уменьшение большого изображения (по конвейеру до cjpeg , поэтому полученное изображение также jpg, для справедливое сравнение с конвертируем )
$ display -verbose input.jpg
input.jpg JPEG 13114x11722 13114x11722+0+0 8-bit sRGB 30.75MB 6.690u 0:06.699
$ /usr/bin/time -f "time=%E mem=%MK" bash -c "convert input.jpg -scale '12.5%' output.jpg"
time=0:10.72 mem=1225844K
$ /usr/bin/time -f "time=%E mem=%MK" bash -c "djpeg -scale 1/8 input.jpg | cjpeg > output2.jpg"
time=0:00.88 mem=1412K
1,2 ГБ против 1,4 МБ и более чем в 10 раз медленнее - и это было на относительно небольшом изображении размером 13 x 11 КБ, которое могло полностью поместиться в ОЗУ, поэтому не происходило перестановки.
С другой стороны, использование djpeg для уменьшения масштаба также имеет свои ограничения: выбор коэффициента масштабирования ограничен, и метод повторной выборки изменить нельзя.