Новый модуль для работы с изображениями и модуль FS

В разрабатываемой новой версии мы обновили модуль Image для работы с изображениями.
Теперь он основан на библиотеке Imagine и предоставляет удобные методы для манипуляции с изображениями. Дополнительной особенностью является поддержка разных PHP библиотек (драйверов): gd, imagick и gmagick. Нужный драйвер устанавливается в конфиге $config['module']['image']['driver']='imagick';

/**
 * Получаем параметры
 */
$aParams=$this->Image_BuildParams('gallery');
/**
 * Создаем объект изображения
 */
if(!$oImage=$this->Image_Open($sFileSource,$aParams)) {
	$sMsgError=$this->Image_GetLastError();
}


Метод Open($sFileSource,$aParams) принимает исходный файл изображения с параметрами, а возвращает объект ModuleImage_EntityImage. Параметры формируются на основе конфига, по умолчанию они такие:
$config['module']['image']['params']['default']['size_max_width']=7000;
$config['module']['image']['params']['default']['size_max_height']=7000;
$config['module']['image']['params']['default']['format_auto']=true;
$config['module']['image']['params']['default']['format']='jpg';
$config['module']['image']['params']['default']['quality']=95;

Далее через объект $oImage уже можно проводить различные манипуляции с изображением.
$oImage->getWidth() — возвращает ширину изображения
$oImage->getHeight() — вернет высоту
$oImage->getFormat() — вернет формат, например, jpg
Также доступны методы обработки изображений, такие методы можно вызывать через цепочку вызова.
$oImage->resize($iWidthDest,$iHeightDest=null,$bForcedMinSize=true) — изменяет размеры изображения
$oImage->cropProportion($fProp,$sPosition='center') — вырезает максимально возможный прямоугольный в нужной пропорции
$oImage->cropSquare($sPosition='center') — вырезает максимально возможный квадрат
$oImage->cropFromSelected($aSelectedSize,$iCanvasWidth=null) — вырезает область выделенную пользователем с помощью библиотеки jCrop
Пример вызова цепочки $oImage->cropProportion(150/100)->resize(50);

Если вам необходимо применить специфические методы библиотеки Imagine, то можно получить ее объект вот так $oImagine=$oImage->getImage(); и уже с ним работать.

Дополнительно доступны методы сохранения изображения:
$oImage->save($sFile) — сохраняет изображение в нужный файл
$oImage->saveTmp() — сохраняет изображение во временный файл
$oImage->saveSmart($sDir,$sFileName) — сохраняет файл в нужный каталог ( относительно корня сайта) с нужным именем
Если потребуется сделать сохранение всех изображения, например, на Amazon S3, то достаточно переопределить специальные методы в модуле Image:
	 /**
	 * Сохраняет(копирует) файл изображения на сервер
	 * Если переопределить данный метод, то можно сохранять изображения, например, на Amazon S3
	 *
	 * @param string $sFileSource	Полный путь до исходного файла
	 * @param string $sDirDest	Каталог для сохранения файла относительно корня сайта
	 * @param string $sFileDest	Имя файла для сохранения
	 * @param int|null $iMode	Права chmod для файла, например, 0777
	 * @param bool $bRemoveSource	Удалять исходный файл или нет
	 * @return bool | string	При успешном сохранении возвращает относительный путь до файла с типом, например, [relative]/image.jpg
	 */
	public function SaveFileSmart($sFileSource,$sDirDest,$sFileDest,$iMode=null,$bRemoveSource=false) {
		...
	}


	 /**
	 * Сохраняет(копирует) файл изображения на сервер
	 * Если переопределить данный метод, то можно сохранять изображения, например, на Amazon S3
	 *
	 * @param string $sFileSource	Полный путь до исходного файла
	 * @param string $sFileDest	Полный путь до файла для сохранения с типом, например, [server]/home/var/site.ru/image.jpg
	 * @param int|null $iMode	Права chmod для файла, например, 0777
	 * @param bool $bRemoveSource	Удалять исходный файл или нет
	 * @return bool | string	При успешном сохранении возвращает относительный путь до файла с типом, например, [relative]/image.jpg
	 */
	public function SaveFile($sFileSource,$sFileDest,$iMode=null,$bRemoveSource=false) {
		...
	}


	 /**
	 * Удаляет файл изображения
	 * Если переопределить данный метод, то можно удалять изображения, например, с Amazon S3
	 *
	 * @param string $sPathFile	Полный путь до файла с типом, например, [relative]/image.jpg
	 *
	 * @return mixed
	 */
	public function RemoveFile($sPathFile) {
		...
	}


	 /**
	 * Проверяет изображение на существование
	 * Если переопределить данный метод, то можно проверить существование изображения, например, на Amazon S3
	 *
	 * @param string $sPathFile Полный путь до файла с типом, например, [relative]/image.jpg
	 *
	 * @return mixed
	 */
	public function IsExistsFile($sPathFile) {
		...
	}


	 /**
	 * Открывает файл изображения, в качестве источника изображения может использоваться полный путь до файла с типом, например, [relative]/image.jpg
	 * Если переопределить данный метод, то можно открывать изображения, например, с Amazon S3
	 *
	 * @param string $sFile	Полный путь до файла с типом, например, [relative]/image.jpg
	 * @param null $aParams
	 *
	 * @return bool|ModuleImage_EntityImage
	 */
	public function OpenFrom($sFile,$aParams=null) {
		...
	}


Модуль FS
Для работы с файлами и их путями мы добавили новый модуль FS — модуль файловой системы. На данный момент он выполняет только основные операции над файлами и берет на себя конвертацию путей различных форматов.
Формат пути файла определяется его префиксом и самим путем — [prefix]/path/to/file. Стандартно поддерживается 3 префикса:
  • server — локальный полный серверный путь до файла
  • relative — локальный относительный путь до файла
  • web — полный web путь до файла (с учетом адреса сайта)
Несколько примеров путей:
[web]http://site.com/uploads/image.jpg
[relative]/uploads/image.jpg
[server]/var/www/site.com/uploads/image.jpg

Такое разделение позволяет в одном поле БД хранить разные варианты путей до файла. Например, для Amazon S3 можно ввести префикс [amazon_s3] и добавить в модуль FS методы конвертации этого пути в другие. С примером Амазона скорее всего будет достаточно введение метода типа GetPathWebFromAmazonS3($sPath), который позволит получить web ссылку на файл.
На данный момент все пути изображений в LS сохраняются с относительным типом (relative). Это позволит избавиться от проблемы переименования изображений при смене домена сайта.

5 комментариев

avatar
Спасибо за информацию, ort. Интересует вопрос, к осени новая версия выйдет, или надо будет подольше ждать? И еще, может я пропустил, вы будете апгрейдить используемую версию jQuery?
  • NNN
  • 0
avatar
Максим большое спасибо за проделанную работу, очень нужный модуль!
avatar
спасибо
avatar
Спасибо за информацию, ort , но хотелось бы кое-что уточнить. Какой по-умолчанию метод resize'а будет использоваться в
$oImage->resize($iWidthDest,$iHeightDest=null,$bForcedMinSize=true)

Я имею ввиду что-то типа bilinear, spline, sinc-filter (Lanczos filter).
Будет ли настройка в параметрах?

$config['module']['image']['params']['default']
  • DNF
  • 0
avatar
Пока используется дефолтный фильтр ImageInterface::FILTER_UNDEFINED
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.