Как уменьшить размер изображения с минимальной доступной памятью?
Сервер с небольшим объёмом оперативки.
Пользователи иногда загружают неприлично крупные изображения, например 8000x8000,
и обработчик на PHP рушится при попытке imagecreatefrompng()
На выходе требуется 1280x720.
Было бы хорошо какой-то утилитой, требующей минимум памяти, уменьшать размер слишком больших картинок до примерно-приемлемых. До того, как передавать в PHP и imagecreatefrompng()
Подскажите, пожалуйста, легчайшие-быстрые утилиты, умеющие уменьшать размер картинок в jpeg, gif, png, webp, скажем, ровно в 2 или 4 раза?
Роман Мирр, на коробченке всего 1 Gb, крутится MySQL, Redis, nginx, php-fpm, docker — и свободно сейчас 460 мегов и 523 свапа. Возможно, это дыра в работе с памятью у php'шного GD. Может, PNG 8k x 8k был с 24-битным цветом и прозрачностью, что при распаковке потребовало 8000*8000*3*4 = 768 мегов. Но в день несколько раз случается обшибка с нехваткой памятью на этапе imagecreatefrom...
Сергей Соколов, лимит для PHP не стоит поднимать на этом этапе. Надо поэкспериментировать сначала с вызовом CLI imagemagick вместо GD, как посоветовал Олег Фролов. Таким образом лимит PHP не будет исчерпан.
1. Только для JPEG есть libepeg.
2. Хотя в условиях нехватки памяти можно выполнять обработку изображений в очереди ограниченным количеством обработчиков.
3. А может таки лучше использовать сторонние службы?
надеюсь, что это особый случай – целочисленные четные коэффициенты уменьшения (ровно в 2 или 4 раза уменьшать) – для которого есть отдельное сверхлегкое решение.
Роман Мирр, наивная интуиция подсказывает, что это могла бы быть совсем простая утилита на C, с библиотеками граф. форматов и умеющая уменьшать картинку потоком, не загружая её целиком в память.
Сергей Соколов,
Кроме того при одновременной обработке нескольких больших изображений расход памяти может резко возрастать. Может стоит использовать очереди и обрабатывать даже на отдельной машине.