Продолжаем описание возможностей Kohana 2.3, на очереди библиотека Image. По названию очевидно, что она предназначена для обработки изображений. Сразу оговорюсь, что доступные действия нельзя назвать разнообразными и всеобъемлющими, но все же…
Сперва заглянем в настройки (config/image.php). Там всего два пункта — имя драйвера ($config['driver']) и набор дополнительных опций драйвера ($config['params']). В настоящее время библиотека поддерживает GD2, ImageMagick и GraphicsMagick (форк ImageMagick’а). GD входит в стандартную поставку PHP начиная с версии 4.3, поэтому его можно смело использовать практически на любом хостинге. Для корректной работы двух оставшихся драйвером рекомендуется указать путь к исполняемому файлу (парамер ‘directory‘ в $config['params']), однако и без него на *NIX-системах Kohana попытается сама определить этот путь. В общем-то все, больше никаких настроек не требуется.
Читаем картинки
Для начала попробуем открыть изображение:
$im = new Image('c:/kohana.png'); // можно использовать и относительные пути $im = new Image('./media/img/kohana.png'); // то же самое, но указываем явно имя драйвера $im = Image::factory('c:/kohana.png', array('driver' => 'GD')); |
Что дальше? Поскольку мы загрузили изображение, должны же мы каким-то образом получить базовую информацию о нем (размеры к примеру). Делается это просто:
echo $im->width; // ширина изображения echo $im->height; // длина изображения echo $im->file; // абсолютный путь к файлу echo $im->type; // тип файла (код) echo $im->ext; // расширение echo $im->mime; // mime-формат файла |
Тип файла (type) представляет собой число от 1 до 16 (возможные коды типов можно посмотреть здесь), но Kohana ограничивает нас пятью типами файлов — GIF, JPEG, PNG и TIFF (две разновидности). Mime представляет собой строку с описанием типа файла для передачи в интернете, каждому типу изображения соответствует свой mime-формат.
Действия над изображением
Естественно, мы загружаем картинку не для того, чтобы всего лишь узнать ее размер. Kohana дает нам возможность редактировать изображение.
- crop($width, $height, $top, $left). Обрезка изображения, в результате чего останется прямоугольник с шириной $width и высотой $height. Параметры $top и $left определяют смещение в оригинальной картинке сверху и слева соответственно, причем можно использовать как численное значение в пикселях, так и строковое (top/center/bottom для вертикального смещения и left/center/right для горизонтального). По умолчанию обрезка будет произведена относительно центра изображения. Точка смещения будет являться центром прямоугольника, который в итоге будет «вырезан». Т.е., если обрезать картинку 400×400 до 200×200 со смещением по умолчанию, то будут обрезаны по 100 пикселей с каждого края изображения. Вырезать из изображения больше, чем оно само невозможно. Однако можно вырезать кусок 400 на 400 со смещением, и тогда часть изображения будет заполнена черным цветом.
- flip($direction). Зеркальное отражение по горизонтали или вертикали. Параметр $direction задает направление отражения и может быть Image::HORIZONTAL или Image::VERTICAL.
- sharpen($amount). Изменение резкости изображения. Параметр $amount определяет степень резкости, от 1 до 100. Честно говоря, не могу привести физическое обоснование данного термина, так как не силен в обработке изображений. Разработчики рекомендуют применять $amount = 20. Также обнаружил, что с полупрозрачными PNG может приводить к непредсказуемым результатам (у меня получилась заливка черного цвета, т.е. прозрачность потерялась).
- rotate($degrees). Поворот изображения на $degrees градусов по часовой стрелке. Можно указывать любое численное значение, но лучше всего от -180 до 180 (к такому формату в итоге приводятся градусы). Обратите внимание, что размеры картинки в итоге могут измениться.
- resize($width, $height, $master = NULL). Изменение размеров изображения (пропорциональное). Размеры могут быть указаны как в пикселях, так и в процентах. Изображение будут вписано в прямоугольник с указанными размерами, можно не указывать один из этих параметров (точнее подставить NULL). Параметр $master определяет, какое значение брать за основное — ширину или высоту, чтобы сохранить пропорции изображения. По умолчанию используется IMAGE::WIDTH, также доступны Image::HEIGHT, Image::AUTO и Image::NONE. Последний вариант — единственный способ не соблюдать пропорции, т.е. будут просто использоваться указанные значения $width и $height.
- quality($amount). Изменение качества изображения, от 1 до 100%. Имеет смысл только для JPEG-файлов (для них по умолчанию 95%).
Все эти методы являются т.н. chainable, т.е. цепочечными (как во многих других библиотеках Kohana, например в Database Query Builder):
$im->resize(200, 0, Image::WIDTH) ->crop(100, 100) ->rotate(-90) ->save(); |
Данные преобразования не выполняются немедленно! Они накапливаются в очереди, и последовательный вызов метода resize() с различными параметрами приведет к тому, что в очереди останется только последний вызов. Работа над изображением инициируется вызовом метода save() или render().
Сохранение изображения
Все выбранные преобразования выполняются над загруженным в память изображением, т.е. оригинальная картинка не изменяется. Чтобы сохранить результаты в новом файле или вместо старого изображения, используйте метод save($new_image, $chmod, $keep_actions). Первый параметр определяет путь к файлу для сохранения (если не указан или FALSE, то будет сохранен в оригинальном файле). Второй параметр задает права на этот файл (например 0755, если не хотите ничего менять укажите FALSE), а третий — сохранять ли очередь преобразований после сохранения (по умолчанию она очищается). Это может быть удобно, если Вы хотите сохранить файл под несколькими именами (например, большое изображение и его thumbnail). Метод возвращает TRUE или FALSE.
При сохранении может поменять тип файла — все зависит от указанного параметра $new_image. Kohana автоматически определяет расширение файла, и на его основании выбирает нужный формат.
Вывод на экран
Изображение можно и не сохранять, а сразу вывести на экран. Это может быть удобно, например, если картинки спрятаны в недоступной извне директории и выводятся через специальный контроллер (который не отдает картинки другим сайтам, накладывает водяные знаки или делает еще что-то). Для этого используйте метод render($keep_actions). Он немедленно отправляет в браузер содержимое картинки (перед этим также формируются необходимые http-заголовки). Параметр $keep_actions имеет то же предназначение, что и в методе save(), разве что вряд ли кто-то будет пробовать выводить на экран сразу две картинки…
Заключение
Как видите, библиотека содержит только самое необходимое (базовые преобразования). А в KO3 уже есть функции для добавления фона (background) и водяных знаков (watermark).
Мне вот пришлось ручками мутить на gd2 штуку, чтобы текст наложить (-: а-ля вотемарк )
Ещё возникает проблемы если сервер собран на стандартном LAMP, в котором урезана GD. Потребовалось пересобирать php с burned GD.