Практикум 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 для загрузки и сохранения изображений, расположенных на других сайтах.

Комментарии