Уменьшение размера пользовательских аватаров? - создание миниатюр
Пользователь моего сайта загружает изображения, которые используются в качестве аватаров. Я установил лимит загрузки 2 МБ. В большинстве мест мне нужны только миниатюры. Но пользователи загружают изображения с гораздо большими разрешениями. Я храню эти файлы в моей файловой системе.
Как я могу создавать эскизы и хранить их вместо файлов большого размера?
7 ответов
В зависимости от вашей установки / настройки сервера, у вас есть несколько возможностей.
- Вы можете использовать библиотеку GD, и что-то вроде
imagecopyresized
функция - Или вы могли бы использовать
Imagick extension
и что-то вроде егоthumbnailImage
метод.
Я бы сказал, что я никогда не видел сервера без установленного GD - для Imagick его установка по умолчанию менее вероятна:-(
Другое решение может заключаться в вызове утилиты командной строки convert (она поставляется с ImageMagick - независимо от любого расширения PHP), используя что-то вроде exec
называть это.
Преимущество в том, что вы не будете ограничены memory_limit
, поскольку изменение размера будет выполняться внешним инструментом - но, конечно, это также означает, что ваше приложение будет полагаться на внешний инструмент, что не всегда приятно...
При необходимости, есть множество учебных пособий по GD; например, они могут вас заинтересовать:
- Как создавать миниатюры с помощью PHP и gd: он использует пакетный процесс для создания миниатюр для многих изображений - что может быть полезно, если вам нужно создавать миниатюры для всех изображений, которые у вас уже есть
- Создание миниатюр с помощью учебника по PHP: некоторые вещи, которые вы не часто видите, например, создание квадратных миниатюр, центрируют оригинальное изображение и добавляют цвет фона.
Вы можете использовать модуль GD или модуль ImageMagick для изменения размера и сжатия любых загруженных изображений.
Если вы будете искать что-то вроде "PHP resizer", вы найдете много примеров. Я склонен использовать GD, так как у меня есть немного кода, который работает просто отлично. Предполагая, что у вас есть известное загруженное изображение JPEG, найденное в $srcImgPath
, вы могли бы сделать что-то вроде следующего, где $newWidth
а также $newHeight
новые размеры изображения, которое вы хотите:
list($width, $height, $type) = getimagesize($srcImgPath);
$srcImg = imagecreatefromjpeg($srcImgPath);
if ($srcImg === false) return false;
$workImg = imagecreatetruecolor($newWidth,$newHeight);
imagecopyresampled($workImg,$srcImg,0,0,0,0,$newWidth,$newHeight,$width,$height);
imagejpeg($workImg,$newFilename,$quality);
Функционализируйте соответствующим образом и обязательно укажите $quality
, Вы можете абстрагировать этот код, чтобы очень легко обрабатывать GIF и PNG.
Посмотрите библиотеку gd, в частности функцию imagecopyresized
Я бы порекомендовал скрипт timthumb.php. это твердое тело. http://www.darrenhoyt.com/2008/04/02/timthumb-php-script-released/
Просто быстрое замечание: если вы идете по маршруту GD, используйте imagecopyresampled, так как он производит более чистые изображения. Я имею в виду, что это не будет выглядеть зернистым и / или неравномерным.
Ссылка на руководство по PHP для функции: http://us2.php.net/manual/en/function.imagecopyresampled.php
Если у вас установлен Imagick в вашей настройке PHP. Тогда есть функция, которая делает это. Imagick:: thumbnailImage ()
Если у вас нет Imagick, то библиотека GD пригодится. Так как они imagcopyresized()
Разве Google AppEngine не оснащен подмножеством PIL? Есть функция "изменить размер", которую можно использовать... и, что лучше всего, вы получаете бесплатную квоту!