Практикум PHP. Умная загрузка изображений.
Во время создания сайтов на PHP очень часто приходится работать с изображениями. Информация о работе с изображениями на PHP довольно разрозненная. Существует много громоздких и разноликих примеров.
Но на просторах интернета было найдено очень интересное решение.
Colin VEROT написал замечательный класс, который всего в несколько строк обработает загрузку изображения или выполнит действие над уже существующей фотографией на сервере. Класс основан на gd library и имеет множество настроек. Отлично справляется с php 4 + версии и изображениями png, gif, jpeg форматов.
Вот немногое из того, что класс умеет:
Обработка изображений из массива $_FILES
Работа над изображениями на сервере
Изменение размеров изображений (с сохранением пропорций или с «растягиванием» изображений). При этом доступны такие фильтры, как:
Не изменять/изменять изображения меньше указанной длинны/высоты
Не изменять/изменять изображения больше указанной длинны/высоты
Дополнение изображений указанным цветом до определённых размеров
Преобразования всех входящих изображений к одному типу
Переименование изображений или их перезапись, если указанный путь сохранения уже содержит такой файл
«Обрезка» области изображений по указанным параметрам
Наложение водяного знака watermark а и текста
Даёт управлять именем нового изображения, его расширением, правами, устанавливаемыми на файл
Обладает множеством встроенных эффектов – управляет яркостью и контрастностью, имеет несколько предопределённых эффектов (отражение, замена цветов – инвертирование, оттенки серого, размытие, поворот, рамки, скос и т.п.).
Кроме загрузки изображений, управляется и с загрузкой файлов (может контролировать загружаемые файлы по mime типам).
Скрипт ведёт статистику изменений, которую можно просмотреть в режиме отладки. И множество переменных для контроля.
А теперь давайте рассмотрим примеры обработки изображений из массива $_FILES с помощью данного класса, и почувствуйте, насколько всё просто:
Примечание автора: более подробные примеры и полное описание на английском Вы можете обнаружить прямо вначале файла класса class.upload.php
Для начала скачаем класс и поместим его в web директорию нашего сайта, подключаем его в нужном месте:
require_once(dirname(__FILE__)."/class.upload.php");
Создадим сам объект класса:
$handle = new Upload($file);
Где $file – путь к файлу, может быть так же объектом из массива $_FILES.
После чего укажем, куда сохранять файл:
$savepath = dirname(__FILE__)."/images";
Обработаем и сохраним файл:
$handle->Process($savepath); $handle->Clean();
Вот и всё! Файл загружен. Осталось только проверить Его наличие по указанному пути $savepath с помощью функции file_exists().
bool file_exists ( string $filename ) – проверяет существование файла, указанного в строковой переменной $filename, если файл существует: возвращает true, иначе – false.
Переменные, которые можно просмотреть до обработки изображения и вызова [имя объекта]->Process([путь сохранения файла]): и до вызова [имя объекта]->clean():
$handle-> file_src_name – имя файла до обработки;
$handle->file_src_name_body – имя файла без расширения до обработки;
$handle->file_src_name_ext – расширение файла до обработки;
$handle->file_src_pathname – полный путь к файлу;
$handle->file_src_size – размер файла;
$handle->file_src_error – ошибка во время обработки/загрузки файла;
$handle->file_is_image – является ли файл изображением?
$handle->image_src_x – ширина изображения?
$handle->image_src_y – высота изображения?
$handle->image_src_pixels – сколько пикселей всего?
$handle->image_src_type – тип изображения.
Переменные, которые можно просмотреть после обработки изображения и вызова [имя объекта]->Process([путь сохранения файла]): и до вызова [имя объекта]->clean():
$handle-> file_dst_path – путь к файлу после обработки;
$handle->dst_name_body – имя файла без расширения после обработки;
$handle->file_dst_name_ext – расширение изображения после обработки;
$handle->file_dst_name – имя файла после обработки;
$handle->file_dst_pathname – полный путь к файлу после обработки;
$handle->image_dst_x – ширина обработанного изображения;
$handle->image_convert – тип преобразованного изображения.
А теперь давайте рассмотрим настройки, которые мы задаём после инициализации объекта класса Upload и до вызова [имя объекта]->Process([путь сохранения файла]):
Загрузить только «изображения»:
$handle->allowed = array("image/*");
Добавим ещё разрешение на загрузку для zip архивов:
$handle->allowed[] = "application/x-zip";
А что делать, если Файл с таким именем уже существует? Не проблема:
$handle->file_auto_rename = true;
И файл будет переименован.
А как задать имя файла?
$handle->file_new_name_body = $image_name;
Преобразовать все загружаемые изображения к типу jpeg?
$handle->image_convert = "jpg";
А как перезаписать файл, если он уже существует?
$handle->file_overwrite = true;
Добавить к изображению Watermark слева внизу? Нет проблем!
$handle->image_watermark = PATH_SITE."/".$watermark_bigger; $handle->image_watermark_position = "LR";
Изменить размеры изображения до 500 на 500 с соблюдением пропорций?
$handle->image_resize = true; $handle->image_x = 500; $handle->image_y = 500; $handle->image_ratio = true;
«Дополнить» изображения до указанного размера фоновым цветом при изменении размера?
$handle->image_resize = true; $handle->image_ratio_fill = true; $handle->image_ratio = true; $handle->image_background_color = "#FF00FF";
Запретить изменять размеры изображений меньше 500 пикселей в ширину и длину?
$handle->image_ratio_no_zoom_in = true;
«Растянуть» изображение без соблюдения пропорций?
$handle->image_ratio = false;
Сменить права на файл после его обработки?
$handle->dir_chmod = 0777;
Попробуем сменить размер загружаемого файла (в байтах)?
$handle->file_max_size = "1024";
Запретим загрузку только определённых файлов по mime type?
$handle->forbidden = array("application/*");
Изменяем яркость изображения?
$handle->image_brightness = 40;
Отражаем изображение по горизонатли?
$handle->image_flip = "h";
Повернём изображение на 90 градусов?
$handle->image_rotate = 90;
Урежем изображение по заданному образцу на 50 пикселей сверху, 40 срава, 30 снизу и 20 слева?
$handle->image_crop = array(50,40,30,20);
Добавим к изображению белую рамку?
$handle->image_border = "3px"; $handle->image_border_color = "#FFFFFF";
Добавим эффект растворения к чёрному с отражением и 60 процентной прозрачностью отражения?
$handle->image_reflection_height = "25%"; $handle->image_default_color = "#000000"; $handle->image_reflection_opacity = 60;
А в следующей статье мы расширим класс с помощью curl (если поддерживается) или url wrapper ов функции fopen, file_get_contents для загрузки и сохранения изображений, расположенных на других сайтах.