Представляю Вашему вниманию класс для пакетной обработки файлов jimage. Класс позволяет делать тумбики изображений, создавать коллаж из десятка картинок, и применять различные gd эффекты к изображениям. А также комбинировать все эти действия.

Класс написан мной для конкретного проекта, и с тех пор успешно применяется во других. Исходный код на гитхабе.

Покажу, как использовать на примере создания тумбиков или если говорить научным языком маленьких копий изображений.

<?php 
define('ROOT',dirname(__FILE__)); // для работы скрипта должна быть объявлена
// эта константа содержащая корень сайта
include "class.jimage.php";
$ji = new jimage();
$ji->thumb(ROOT.'/img/1.png',ROOT.'/img/mini_1.png',100); 

элементарно и просто. У метода есть ряд настроек, первой идет путь до изображения. Второй путь до итогового тумбика, 3 и 4 это размеры по ширине и высоте соответственно, 5 - ый параметр это флаг, который может иметь несколько значений 

USE_HOWSET или '' - и ширина и высота должны быть заданы, размер итогового тумбика задается строго, изображение обычно искажается
USE_WIDTH или 'w' - задается только ширина итогового тумбика, высота считается пропорционально по заданному изображению
USE_HEIGHT или 'h' - тоже только по высоте
USE_AUTO или 'a' - по умолчанию, задаем и высоту и ширину, если входящее изображение вертикальное то размеры тумбика расчитываются так, чтобы все изображение влезло в заданные пределы.

Поясню все варианты на примерах, возьмем за основу изображение красавицы Хайден Панеттьери

Начальное изображение для тестов

$ji->thumb( ROOT.'/img/1.jpg',ROOT.'/img/mini_1.jpg',100,200,USE_HOWSET);// строгое задание размеров

Создание тумбика с использованием опции USE_HOWSET

Иображение растянуто, рамеры строго соответствуют тем, которые заданны

$ji->thumb( ROOT.'/img/1.jpg',ROOT.'/img/mini_2.jpg',200,0,USE_WIDTH);

Использование опции USE_WIDTH

Изображение по ширине строго соответствует 200px, а по высоте вычисляется пропорционально исходному иображению

$ji->thumb( ROOT.'/img/1.jpg',ROOT.'/img/mini_3.jpg',200,0,USE_HEIGHT);

Использование опции USE_HEIGHT

тоже, что и по ширине. Высота соответствует 3-му параметру, а ширина вычисляется.

$ji->thumb( ROOT.'/img/1.jpg',ROOT.'/img/mini_4.jpg',200,200,USE_AUTO);

 Использование опции USE_AUTO

Изображение вписывается в указанные приделы.

Разумеется - это не все возможности данного класса. Вот еще одно, интересное применение: пакетное применение фильров

<?php 
define('ROOT',dirname(__FILE__));
include "class.jimage.php";
$ji = new jimage();
$ji->image_replace = true;
$ji->each(ROOT.'/img/',function($image,$_this){
	$_this->filter($image,IMG_FILTER_GRAYSCALE);
});

В результате, ко всем изображениям в папке img, будет применен эффект оттенки серого. Вот полный список поддерживаемых эффектов

IMG_FILTER_NEGATE: Меняет все цвета изображения на обратные. 
IMG_FILTER_GRAYSCALE:Преобразует изображения в оттенки серого.
IMG_FILTER_BRIGHTNESS: Изменение яркости изображения. Вторым аргументом после типа фильтра можно указать уровень яркости.
IMG_FILTER_CONTRAST: Изменение контрастности изображения. Вторым аргументом после типа фильтра можно указать уровень контрастности.
IMG_FILTER_COLORIZE: как и IMG_FILTER_GRAYSCALE, За исключениме того, что можно задать параметры r, g, b, и уровень альфа канала. Значение от 0 до 255
IMG_FILTER_EDGEDETECT: Использует обнаружение края, чтобы выделить края в изображении. 
IMG_FILTER_EMBOSS:  Выделение объема изображения
IMG_FILTER_GAUSSIAN_BLUR: Размывает изображение, используя метод Гаусса. 
IMG_FILTER_SELECTIVE_BLUR: Размывает изображение
IMG_FILTER_MEAN_REMOVAL: "sketchy" эффект. 
IMG_FILTER_SMOOTH: Делает изображение более гладким. Вторым параметром можно установить уровень гладкости.
IMG_FILTER_PIXELATE: Применяется эффект  пикселизации к изображению, вторым параметром можно установить  размер блока 

Метод фильтр можно применять и для одиночных изображений, к примеру применим сразу 3 эффекта нашей Хайден

<?php 
define('ROOT',dirname(__FILE__)); 
include "class.jimage.php";
$ji = new jimage();
$ji->image_replace = true;
$ji->filter(ROOT.'/img/1.jpg',IMG_FILTER_GRAYSCALE);
$ji->filter(ROOT.'/img/1.jpg',IMG_FILTER_BRIGHTNESS,40);
$ji->filter(ROOT.'/img/1.jpg',IMG_FILTER_EDGEDETECT);

В результате получим такую фотографию

Использование метода filter и трех эффектов IMG_FILTER_GRAYSCALE, IMG_FILTER_BRIGHTNESS и IMG_FILTER_EDGEDETECT

Удобно для быстрой генерации уникальных изображений, к примеру для досок объявлений после работы парсера. 

Можно придумать 1000 и одно применение метода each, я покажу лишь, как я применил его в одном из своих проектов. В папке лежит множество изображений. Нужно вывести все их из папки, для плагина галереии на jquery. Нет ничего проще.

$jI = new jImage();
$jI->town = 'ufa';
$jI->s = '';
$jI->each(ROOT.'/img/',function($image,$_this){
	list($w) = getimagesize($image);
	$_this->s.='<div><img width="'.$w.'px" src="images/towns/'.$_this->town.'/thumbs/'.basename($image).'"/></div>';
});
echo $jI->s;

Как я уже писал выше, класс умеет делать автоматический коллаж из нескольких изображений. Можно использовать для этого специальные сервисы чтобы сделать коллаж онлайн. Однако, если Вам нужно автоматическое создание коллажей, то все они Вам не подходят. А класс делает это на раз. Для этого есть метод joinAll( $path,$file_output,$size,$org = USE_HEIGHT,$filter_add = false,$filter_use = false )

  1. Первым параметром идет путь до папки с иображениями,
  2. вторым путь до итогового коллажа,
  3. третьим размер по высоте или ширине коллажа, в зависимости от того, какой вариант коллажа мы делаем (вертикальный или горизонтальный),
  4. 4-ый параметр и задает это  USE_HEIGHT - горизонтальный коллаж,  USE_WIDTH - вертикальный.
  5. Последние два параметра задают фильтры,
  6. 5-ой применяется ко всему коллажу и коллаж копируется полностью, и добавляется к исходному коллажу. 
  7. 6-ый просто применяется ко всему коллажу
  8. Сделаем автоматический коллаж изображений чудесной Фриды Пинто
  9. <?php 
    define('ROOT',dirname(__FILE__)); 
    include "class.jimage.php";
    $ji = new jimage();
    $ji->image_replace = true;
    $ji->joinAll(ROOT.'/frida/',ROOT.'/frida_kollag.jpg',100);

    Автоматический коллаж изображений на PHP

  10. или вертикальный вариант

    $ji->joinAll(ROOT.'/frida/',ROOT.'/frida_kollag.jpg',100, USE_WIDTH);

    Вертикальный автоматический коллаж изображений на php 

Применим фильтр скетч эффекта

<?php 
define('ROOT',dirname(__FILE__));
include "class.jimage.php";
$ji = new jimage();
$ji->image_replace = true;
$ji->joinAll(ROOT.'/frida/',ROOT.'/frida_kollag.jpg',100, USE_HEIGHT,IMG_FILTER_MEAN_REMOVAL);

и такой итоговый коллаж

 Применение эффекта к коллажу, с совмещением обоих изображений на php

или тоже самое но просто применяем к коллажу

$ji->joinAll(ROOT.'/frida/',ROOT.'/frida_kollag.jpg',100, USE_HEIGHT,false,IMG_FILTER_MEAN_REMOVAL);

Автоматическое создание коллажа на php и применение эффекта к нему

По умолчанию скрипт генерирует изображение только один раз, чтобы обновлять созданные изображение нужно поставить флаг  $ji->image_replace = true;

Вот и все, буду рад если класс окажется полезен кому-нибудь. 

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

Дмитрий
# Дмитрий 15.04.2013 12:51
Благодарю
Alex
# Alex 12.05.2013 06:08
У меня во всех проектах самописный класс, который юзает Imagick - замерял производительность на ~10000 изображений, быстродействие Imagick примерно в 3 раза выше, чем GD. Когда юзал GD, сервер стабильно ложился при одновременной загрузке пользователями сотни фото.
Leroy
# Leroy 12.05.2013 18:08
так может Гоу?! покажем общественности? потестим, предложим чего
Alex
# Alex 16.05.2013 06:29
Да вот уже, года два как собираюсь почистить код и выложить в паблик - библиотека писалась для крупного дейтинг сайта и там надо выкинуть код, специфичный для того проекта :-)
Leroy
# Leroy 16.05.2013 14:21
надо надо. ничего так не дисциплинирует писать хороший код, как то, что его потом кто-то увидит)
CharCoder
# CharCoder 29.05.2013 03:19
Почему у автора нет контактов? Хотелось бы с ним пообщаться. Естественно не бесплатно.
Lemar
# Lemar 20.02.2016 22:13
Доброго всем времени суток!
Дописал в этот класс 2 полезные "штуки":
1. Обрезка картинки по квадрату, привязываясь к центру изображения.
Пример 1: 1280х720 в 400х400 (в реальности обрезается до 720х720 и сжимается)
Пример 2: 600х900 в 300х300 (в реальности обрезается до 600х600 и сжимается)
2. Обрезка картинки по заданным размерам, привязываясь к центру изображения.
Пример 1: 1280х960 в 400х200 (обрежется в 1280х640 и сожмется)
Пример 2: 1280х960 в 200х400 (обрежется в 480х960 и сожмется)
Пример 3: 720х1280 в 400х300 (обрежется в 960х720 и сожмется)
Пример 4: 720х1280 в 300х400 (обрежется в 540х720 и сожмется)

РЕАЛИЗАЦИЯ:
В начале php файла добавить:
define('USE_SQUARE','s'); // сжатие с обрезкой по центру по квадрату заданной ширины
define('USE_CENTER','c'); // сжатие с обрезкой по центру по заданным ширине, высоте

В функцию resize добавить в начале переменные для координат обрезки:
$src_x = 0;
$src_y = 0;
В той же функции добавить:
if ($org == USE_AUTO) {
...

} else if ($org == USE_SQUARE) {
$height = $width;
if ($w_i > $h_i) {
$src_x = ($w_i-$h_i)/2;
$src_y = 0;
$w_i = $h_i;
} else {
$src_x = 0;
$src_y = ($h_i-$w_i)/2;
$h_i = $w_i;
}
} else if ($org == USE_CENTER) {
if ($w_i > $h_i) {
if ((($width*$h_i)/$height) > $w_i) {
$src_x = 0;
$src_y = ($h_i-(($height*$w_i)/$width))/2;
$h_i = (($height*$w_i)/$width);
} else {
$src_x = ($w_i-(($width*$h_i)/$height))/2;
$src_y = 0;
$w_i = (($width*$h_i)/$height);
}
} else {
if ((($height*$w_i)/$width) > $h_i) {
$src_x = ($w_i-(($width*$h_i)/$height))/2;
$src_y = 0;
$w_i = (($width*$h_i)/$height);
} else {
$src_x = 0;
$src_y = ($h_i-(($height*$w_i)/$width))/2;
$h_i = (($height*$w_i)/$width);
}
}
}

В imagecopyresampled вместо двух нулей указать $src_x и $src_y вот так:
imagecopyresampled ($img_o, $img, 0, 0, $src_x, $src_y, $width, $height, $w_i, $h_i);

ГОТОВО.

Использование:
$ji->thumb('path_to_src_img', 'path_to_result', 200, 0, 's'); // создаст картинку 200х200, ориентируясь на центр исходной картинки
$ji->thumb('path_to_src_img', 'path_to_result', 400, 200, 'c'); // создаст картинку 400х200, ориентируясь на центр исходной картинки
$ji->thumb('path_to_src_img', 'path_to_result', 200, 200, 'c'); // создаст аналогично первому картинку 200х200, просто в ходе выполнения пройдет 1 лишнее условие

P.S. Может кому пригодится...
Лично я часто использую создание миниатюры именно произвольного размера за счет обрезки лишнего. Но важно, чтобы центр картинки сохранялся...