Контент


Работа с изображениями

Продолжаем описание возможностей 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). ;)

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Опубликовано в cправочник.

Теги: , .


Комментарии (2)

Будьте в курсе обсуждения, подпишитесь на RSS ленту комментариев к этой записи.

  1. DeTeam пишет:

    Мне вот пришлось ручками мутить на gd2 штуку, чтобы текст наложить (-: а-ля вотемарк )

  2. Jet пишет:

    Ещё возникает проблемы если сервер собран на стандартном LAMP, в котором урезана GD. Потребовалось пересобирать php с burned GD.



Можно включить подсветку кода: <code><pre lang="">...</pre></code>
Разрешены некоторые HTML теги

или используйте trackback.