PHP автоматическое изменение размера изображения и создание миниатюр
- Категория: Код
- – Автор: Игорь (Администратор)
Практически любой сайт в определенный момент времени сталкивается с необходимостью создания миниатюр для множества изображений. Причин тому масса. Начиная от желания добавить картинки в различные списки, как, например, при выводе последних материалов. Заканчивая написанием собственных галерей и каталогов.
Основная проблема не столько в том, что необходимо для каждой картинки создать миниатюру. Это легко можно сделать, при помощи программы для пакетной обработки файлов, и в последствии, при наполнении, добавлять картинки с миниатюрами. Сколько в том, что, с большой вероятностью, вам могут потребоваться картинки разных размеров. Заранее предугадать все необходимые размеры попросту невозможно. Именно поэтому необходим инструмент для автоматического изменения размеров изображений и создания миниатюр, который позволит решить сразу обе проблемы: создание миниатюр в автоматическом режиме и формирование любых размеров по требованию.
Примечание: Если вы решите изменять размеры картинок, при помощи CSS, то вас ждет один неприятный сюрприз. Дело в занимаемом дисковом пространстве картинок. К примеру, если вы выведите на сайте 100Кб картинку, и установите в CSS свойство width в "50px", то, несмотря на то, что картинка будет выглядеть маленькой, она по прежнему будет занимать 100Кб. Наверное, вы уже понимаете сколько лишнего трафика будет проходить каждый раз, когда будет открываться страница хотя бы с десятком таких миниатюр.
Примечание: Большинство готовых модулей уже содержат встроенные механизмы для автоматического создания миниатюр и может показаться, что использование этих механизмов будет самым простым выходом. Однако, в большинстве случаев эти механизмы либо имеют зашитые настройки, которые не просто изменить или вынести в отдельный блок настроек, либо используют другие части модуля, либо равномерно распределены по всему модулю (их код разбросан по разным файлам).
Пишем инструмент для автоматического создания миниатюр
Примечание: Если вас не интересуют этапы создания и вам нужен готовый модуль, то перейдите к следующему разделу "Настройка скрипта".
Перед тем, как начинать писать инструмент, необходимо определиться с минимальным набором требований. После некоторого времени у вас появиться подобного рода список:
- Уникальность имен миниатюр. Когда у вас много статей или товаров, то, велика вероятность, что найдутся, как минимум, два изображения с одинаковыми названиями. Так же вы просто можете сортировать картинки по каталогам, не заботясь об уникальности имен.
- Поддержка разных типов картинок. В основном, это gif, png и jpg.
- Динамические размеры. В любой момент времени вам могут потребоваться другие размеры миниатюр. Например, вы изменили немного верстку для отображения элементов списка и вам необходимо изменить размеры миниатюр. Это действие должно решаться простым изменением параметра в url.
- Кэширование картинок. Картинки должны не только физически создаваться на диске (т.к. изменение размера изображения занимает время), но и кэшироваться браузером (каждое обращение за картинкой - это лишний запрос). А так же сами картинки должны периодически заново создаваться. Ведь, возможно, что какие-то картинки были изменены, со времени создания миниатюр.
- Возможность быстро удалить все миниатюры. Все миниатюры должны храниться в одном месте. В противном случае, банальная очистка сайта от лишних файлов или необходимость массового пересоздания миниатюр вызовут у вас определенные трудности.
- Простота внедрения. Скрипт должен легко встраиваться на любой сайт и использовать минимальный набор базовых функций языка php.
После того, как были определены требования, можно приступать к написанию.
Создайте файл с названием "thumb.php" и внесите первый блок - блок с параметрами:
В этом блоке определены следующие параметры: каталог для хранения миниатюр, ограничения размера (ширины) и его значение по умолчанию, время кэширования результата, значение идентификатора по умолчанию. Если большая часть параметров понятна, то параметр идентификатора необходимо пояснить. Идентификатор используется для того, чтобы отделить картинки с одинаковыми названиями друг от друга. Целочисленный ID есть практически везде, он есть у любой статьи и у любого товара. В крайнем случае, его достаточно просто определить.
Примечание: Изменение размера картинки происходит пропорционально, поэтому достаточно использовать только ширину миниатюры.
Теперь, необходимо определиться с названиями параметров и шаблоном ссылки, а так же реализовать блок считывания значений параметров и их проверки. Шаблон ссылки делаем следующим образом:
- site.ru/thumb.php?[id={Идентификатор}]&[s={Ширина}]&[f={Полный путь к изображению}]
Примечание: Короткие имена выбраны для простоты. Вы можете изменить названия параметров, но тогда придется немного подкорректировать код.
Определяем блок:
Теперь, необходимо на всякий случай проверить наличие функции для определения mime типа. И если таковой не окажется, то создать свою:
Теперь, создаем блок, который проверяет существует ли такая миниатюра и не истек ли ее срок жизни. В случае удачи, отдаем картинку на клиент:
Теперь, пишем блок, который создает миниатюру для картинки, на основе всех полученных параметров.
На выходе получился небольшой инструмент, который динамически создает и кэширует миниатюры с уникальными названиями в одном каталоге, поддерживает разные форматы картинок и просто внедряется. Таким образом, php-скрипт полностью выполняет все требования.
Настраиваем php-скрипт для автоматического изменения размеров изображений
Примечание: Если вы пропустили раздел "Пишем инструмент" или же не создавали файл, то скачать готовый файл вы можете тут: thumb.zip
Полученный файл скопируйте в то место, где вам будет угодно. Например, в папку "utils". После чего приступите к настройке. Откройте файл и перезапишите настройки по умолчанию:
- $path_thumbs - путь к папке для хранения миниатюрами (по умолчанию путь 'images/thumbs/'). Не забудьте создать этот каталог.
- $size_min - минимальная ширина миниатюры в пикселях (по умолчанию 1).
- $size_def - ширина миниатюр в пикселях по умолчанию (по умолчанию 40)
- $size_max - максимальный размер в пикселях миниатюры (по умолчанию 1600)
- $cache_lifetime - время кэширования каждой миниатюры в секундах (по умолчанию 84000 * 30, т.е. тридцать дней)
- $id_def - значение идентификатора по умолчанию (по умолчанию 0). Идентификатор применяется для создания уникальных имен миниатюр.
После внесения настроек, php-скрипт для автоматического изменения размеров уже можно использовать. Для этого еще раз вспоминаем шаблон:
- site.ru/utils/thumb.php?[id={Идентификатор}]&[s={Ширина}]&[f={Полный путь к изображению}]
Пример реального запроса будет выглядеть так:
- site.ru/utils/thumb.php?id=15&s=100&f=images/razdel-1/statya-15/start.png
Однако, в эпоху использования красивых ЧПУ ссылок, такой запрос будет выглядеть несколько некрасиво. Поэтому необходимо добавить в файл ".htaccess" в корне сайта следующие строки (при условии, что хостинг поддерживает mod_rewrite и что в файле .htaccess есть строка с "RewriteEngine On"):
Теперь, к существующему шаблону добавился еще один:
- site.ru/thumb/{Идентификатор}/{Ширина}/{Полный путь к изображению}
После этого, пример реального запроса будет выглядеть следующим образом:
- site.ru/thumb/15/100/images/razdel-1/statya-15/start.png
Миниатюры, по сути, дублируют изображения на сайте. Поэтому может потребоваться настройка файла robots.txt. Конечно, поисковые системы должны адекватно реагировать на существование миниатюр, и не считать это за попытку манипуляцией поисковой выдачи. Тем не менее, если вы сомневаетесь в этом, то стоит добавить к правилам в robots.txt следующие строки (при условии, что thumb.php находится в папке utils):
Теперь, у вас есть отличный инструмент для автоматического изменения размеров изображений на php, который динамически создает и кэширует миниатюры с уникальными названиями в одной директории, поддерживает разные форматы изображений и легко внедряется на любой сайт.
Скачать готовый инструмент можно тут:
☕ Понравился обзор? Поделитесь с друзьями!