Если вы сжимаете изображения JPEG, imagemagick поддерживает сжатие при загрузке. Например, вот изображение JPEG размером 10k x 10k пикселей с уменьшенным размером до 200x200.
$ /usr/bin/time -f %M:%e \
convert wtc.jpg -resize 200x200 x.jpg
713340:2.98
Это 720 МБ пикового использования памяти и почти 3 секунды процессорного времени. Теперь попробуйте следующее:
$ /usr/bin/time -f %M:%e \
convert -define jpeg:size=400x400 wtc.jpg -resize 200x200 x.jpg
35952:0.32
До 35 МБ памяти и 300 мс ЦП.
-define jpeg:size=400x400
намекает загрузчику JPEG, что вам нужно изображение размером не менее 400x400 пикселей, поэтому (в данном случае) во время загрузки он будет иметь размер 1/8. Вам нужно, чтобы размер подсказки загрузки был как минимум в 2 раза больше, чем ваш окончательный выходной размер, чтобы избежать наложения.
Вы можете установить это из imagick с помощью setOption
.
К сожалению, многие загрузчики не поддерживают сжатие при загрузке. PNG особенно плох:
$ /usr/bin/time -f %M:%e \
convert wtc.png -resize 200x200 x.jpg
828376:5.62
830 МБ и 5,6 с.
Вы могли бы рассмотреть другие программы изменения размера. vipsthumbnail
- это быстро и мало памяти для почти всех форматов файлов, например:
$ /usr/bin/time -f %M:%e \
vipsthumbnail wtc.png --size 200x200 -o x.jpg
58780:2.29
60 МБ и 2,3 секунды для того же файла PNG. Качество такое же, как и у imagemagick.
Он также имеет PHP привязку - вы можете написать, например:
$image = Vips\Image::thumbnail('somefile.jpg', 200);
$image->writeToFile('tiny.jpg');