Классы для работы с изображениями с использованием утилит NConvert и ImageMagick
Автор: Куликов Денис [18 ноября 2013]
Версия: 1.11
Тэги: Графика
Это копия статьи, взятой с сайта автора. Копия может устареть, поэтому рекомендуется в первую очередь попытаться воспользоваться первоисточником.
При всей своей замечательности Parser имеет очень ограниченный набор функций для работы с изображениями. Тем не менее при создании сайтов с использованием данного языка периодически возникает необходимость изменить размер изображения, повернуть его или сохранить в другом формате.
Что ж, как обычно, если Parser чего-то не умеет, то надо вызвать внешний скрипт, который может сделать необходимое и воспользоваться результатом его работы. И тут нам на помощь приходит замечательная утилита nconvert. (За наводку спасибо Eugene Spearance). Утилита может много чего. Поэтому для маньяков возможности по работе с изображениями теперь ограничены только их маньячной фантазией :). Поскольку я маньяком не являюсь, то в описываемом классе реализованы основные возможности для работы с картинками.
Немного позже Misha v.3 предложил сделать класс более универсальным и совместить его еще и с ImageMagick'ом. Для этого в исходном Img.p были оставлены только методы, определяющие интерфейс работы с классом. Все же, что занимается вызовом внешних скриптов и некоторые специфические вещи были вынесены в соответствующие классы NConvert.p и ImageMagick.p, которые являются наследниками класса Img.
Для чего все это нужно? А что бы не было мучительно больно, когда при переезде на другой хостинг вы обнаруживаете, что там нету ImageMagick или для тамошней ОС нет нужной версии nconvert'a. В этом случае, при использовании описываемого набора классов, вам нужно лишь подключить NConvert.p вместо используемого ImageMagick.p (или наоборот) и все. Больше в коде ничего менять не нужно. И не надо думать, что переезжать не придется. Как только вы так подумаете, то придется, обязательно! :)
Итак, что может класс и как с ним работать
Для начала надо определиться какой именно внешней программой вы будете пользоваться
Создаем объект
Все, на этом различия закончены. Теперь мы можем пользоваться методами объекта $oImg, которые имеют единый интерфейс, независимо от того, какой внешней программой мы пользуемся.
Примечания:
- В примерах ниже $sFileSrc и $sFileDest - это исходный и конечный файл соответственно (путь указывается от корня веб-пространства).
- При конвертировании поддерживаются форматы jpeg, gif ,png, bmp, tiff.
- Если формат исходного изображения не указан принудительно, то он определяется исходя из расширения конечного файла.
- По умолчанию используется качество 80% для конвертирования в jpg и 64 цвета для конвертирования в gif
- Значения по умолчанию можно переопределить при создании объекта, используя параметры $.iColors $.iQuality $.bKeepRatio $.bRemoveMeta
Получение информации об изображении
^oImg.info[$sFileSrc]
Возвращает следующий хэш
$.sFormat - формат
$.iWidth - ширина (px)
$.iHeight - высота (px)
$.sCompression - сжатие
$.iColors - кол-во цветов
$.iXdpi - разрешение по горизонтали (dpi)
$.iYdpi - разрешение по вертикали (dpi)
$.sOrientation
При использовании ImageMagick может присутствовать поле:
$.sQuality
Конвертирование изображения в необходимый формат
^oImg.convert[$sFileSrc;$sFileDest;$sFormat;$hParams]
Здесь
$sFormat - выходной формат
$hParams - хэш со следующими полями
$.bRemoveMeta - флаг удаления метаданных
$.iQuality - качество для jpg и png.
$.iColors - кол-во цветов (256, 216, 128, 64, 32, 16 или 8)
Изменение размера изображения
^oImg.resize[$sFileSrc;$sFileDest;$sWidth;$sHeight;$hParams]
Здесь
$sWidth и $sHeight и высота получаемого изображения соответственно
$hParams - хэш со следующими полями
$.bKeepRatio - флаг сохранения пропорций (по умолчанию 0)
$.sResizeType - тип изменения размера
incr : только увеличение
decr : только уменьшение
$.bRemoveMeta - флаг удаления метаданных
$.sFormat - выходной формат
$.iQuality - качество для jpg и png
$.iColors - кол-во цветов (256, 216, 128, 64, 32, 16 или 8)
$.sResampleType - Алгоритм при изменении размера
lz,lanczos : Lanczos (по умолчанию)
g,gaussian : Gaussian
m,mitchell : Mitchell
# только для NConvert
q, quick : Quick resize
l, linear : Bi-linear (linear)
h, hermite : Hermite
b, bell : Bell
bs, bspline : Bspline
Вырезание прямоугольной области (crop)
^oImg.crop[$sFileSrc;$sFileDest;$iX;$iY;$iCropWidth;$iCropHeight;$hParams]
Здесь
$iX - x-координата левого верхнего угла
$iY - y-координата левого верхнего угла
$iCropWidth - ширина области
$iCropHeight - высота области
$hParams - хэш со следующими полями
$.sFormat - выходной формат
$.bRemoveMeta - флаг удаления метаданных
$.iQuality - качество для jpg и png
$.iColors - кол-во цветов (256, 216, 128, 64, 32, 16 или 8)
Наложение "водяных знаков"
^oImg.watermark[$sFileSrc;$sFileDest;$sWMFile;$hParams]
Здесь
$sWMFile - накладываемое изображение (лучше всего использовать полупрозрачный png)
$hParams - хэш со следующими полями
$.iX - x-координата левого верхнего угла накладываемого изображения
$.iY - y-координата левого верхнего угла накладываемого изображения
$.sPosition - позиция накладываемого изображения
top-left, left-top : top-left
top-center, center-top : top-center
top-right, right-top : top-right
center-left, left-center : center-left
center : center
center-right, right-center : center-right
bottom-left, left-bottom : bottom-left
bottom-center, center-bottom : bottom-center
bottom-right, right-bottom : bottom-right
$.sFormat - выходной формат (кроме gif)
$.bRemoveMeta - флаг удаления метаданных
$.iQuality - качество для jpg и png
Указывается либо позиция, либо координаты
Примечание:
При использовании ImageMagick надо не забыть при создании объекта указать имя скрипты, который будет отвечать за данное преобразование
^use[ImageMagick.p]
$oImg[^ImageMagick::create[
# Путь, где находится convert из пакета ImageMagick
$.sScriptPath[/../data/bin/ImageMagick]
# Имя самого файла
$.sScriptName[convert]
# Имя файла composite для @watermark[] (если он используется)
$.hScriptName[
$.watermark[composite]
]
]]
Поворот изображения
^oImg.rotate[$sFileSrc;$sFileDest;$iAngle;$hParams]
Здесь
$iAngle - угол в градусах
$hParams - хэш со следующими полями
$.sBGColor - цвет фона (формат "R,G,B")
$.sFormat - выходной формат
$.bRemoveMeta - флаг удаления метаданных
$.iQuality - качество для jpg и png
$.iColors - кол-во цветов (256, 216, 128, 64, 32, 16 или 8)
Поворот JPEG без потери качества
^oImg.rotateJPG[$sFileSrc;$iAngle]
Здесь $iAngle - угол поворота в градусах (+/-90, 180, +/-270)
В результате исходный файл заменяется.
Этот метод работает только при использовании NConvert.
Он не реализован в классе ImageMagick, т.к. в одноименной библиотеке отсутствует подобный функционал.
За критику и дельные советы большое спасибо Misha v.3
Если кто-то пользуется другими утилитами для работы с изображениями, то welcome :)
Вот собственно и все.
Скачать:
Img.zip
(18.10.2013
5,9 КБ)
Архив с классами Img, ImageMagick, NConvert
ImageResize.zip
(31.05.2011
1,2 КБ)
Архив с классом ImageResize, упрощающем изменение размеров изображений