ModuleImage
Package | engine.modules |
---|---|
Inheritance | class ModuleImage » Module » LsObject |
Since | 1.0 |
Source Code | /engine/modules/image/Image.class.php |
Protected Properties
Property | Type | Description | Defined By |
---|---|---|---|
aParamsDefault | array | Настройки модуля по умолчанию | ModuleImage |
bIsInit | bool | Указывает на то, была ли проведенна инициализация модуля | Module |
oEngine | Engine | Объект ядра | Module |
sLastErrorText | string | Тескт последней ошибки | ModuleImage |
Public Methods
Method | Description | Defined By |
---|---|---|
BuildHTML() | Возвращает валидный Html код тега | ModuleImage |
BuildParams() | Возврашает параметры для группы, если каких то параметров в группе нет, то используются дефолтные | ModuleImage |
ClearLastError() | Очищает текст последней ошибки | ModuleImage |
CopyFileToLocal() | Копирует файл изображения в локальную файловую систему | ModuleImage |
CreateDirectory() | Создает каталог по указанному адресу (с учетом иерархии) | ModuleImage |
CreateImageObject() | Возвращает объект изображения | ModuleImage |
CropProportion() | Вырезает максимально возможный прямоугольный в нужной пропорции | ModuleImage |
CropSquare() | Вырезает максимально возможный квадрат | ModuleImage |
GetIdDir() | Получает директорию для данного пользователя | ModuleImage |
GetLastError() | Получает текст последней ошибки | ModuleImage |
GetServerPath() | Возвращает серверный адрес по переданному web-адресу | ModuleImage |
GetWebPath() | Возвращает WEB адрес по переданному серверному адресу | ModuleImage |
Init() | Инициализация модуля | ModuleImage |
RemoveFile() | Удаление файла изображения | ModuleImage |
Resize() | Resize,copy image, | ModuleImage |
SaveFile() | Сохраняет(копирует) файл изображения на сервер | ModuleImage |
SetInit() | Помечает модуль как инициализированный | Module |
SetLastError() | Устанавливает текст последней ошибки | ModuleImage |
Shutdown() | Метод срабатывает при завершении работы ядра | Module |
__call() | Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля | Module |
__construct() | При создании модуля передаем объект ядра | Module |
isInit() | Возвращает значение флага инициализации модуля | Module |
Protected Methods
Method | Description | Defined By |
---|---|---|
__clone() | Блокируем копирование/клонирование объекта | Module |
Property Details
Настройки модуля по умолчанию
Тескт последней ошибки
Method Details
public string BuildHTML(string $sPath, array $aParams)
| ||
$sPath | string | WEB адрес изображения |
$aParams | array | Параметры |
{return} | string |
public function BuildHTML($sPath,$aParams) {
$sText='<img src="'.$sPath.'" ';
if (isset($aParams['title']) and $aParams['title']!='') {
$sText.=' title="'.htmlspecialchars($aParams['title']).'" ';
/**
* Если не определен ALT заполняем его тайтлом
*/
if(!isset($aParams['alt'])) $aParams['alt']=$aParams['title'];
}
if (isset($aParams['align']) and in_array($aParams['align'],array('left','right','center'))) {
if ($aParams['align'] == 'center') {
$sText.=' class="image-center"';
} else {
$sText.=' align="'.htmlspecialchars($aParams['align']).'" ';
}
}
$sAlt = isset($aParams['alt'])
? ' alt="'.htmlspecialchars($aParams['alt']).'"'
: ' alt=""';
$sText.=$sAlt.' />';
return $sText;
}
Возвращает валидный Html код тега
public array BuildParams(string $sName=NULL)
| ||
$sName | string | Имя группы |
{return} | array |
public function BuildParams($sName=null) {
if(is_null($sName)) {
return Config::Get('module.image.default');
}
$aDefault = (array)Config::Get('module.image.default');
$aNamed = (array)Config::Get('module.image.'.strtolower($sName));
return func_array_merge_assoc($aDefault,$aNamed);
}
Возврашает параметры для группы, если каких то параметров в группе нет, то используются дефолтные
public void ClearLastError()
|
public function ClearLastError() {
$this->sLastErrorText=null;
}
Очищает текст последней ошибки
public bool CopyFileToLocal(string $sFileSource, string $sFileDistLocal)
| ||
$sFileSource | string | Полный серверный путь до файла (может быть на удаленном сервере) |
$sFileDistLocal | string | Полный серверный путь до локального файла |
{return} | bool |
public function CopyFileToLocal($sFileSource,$sFileDistLocal) {
if (@copy($sFileSource,$sFileDistLocal)) {
return true;
}
return false;
}
Копирует файл изображения в локальную файловую систему
public void CreateDirectory(string $sDirDest)
| ||
$sDirDest | string | Каталог относительно корня сайта |
public function CreateDirectory($sDirDest) {
@func_mkdir(Config::Get('path.root.server'),$sDirDest);
}
Создает каталог по указанному адресу (с учетом иерархии)
public LiveImage CreateImageObject($sFile $sFile)
| ||
$sFile | $sFile | Путь до изображения |
{return} | LiveImage |
public function CreateImageObject($sFile) {
return new LiveImage($sFile);
}
Возвращает объект изображения
public LiveImage CropProportion(LiveImage $oImage, int $iW, int $iH, bool $bCenter=true)
| ||
$oImage | LiveImage | Объект изображения |
$iW | int | Ширина для определения пропорции |
$iH | int | Высота для определения пропорции |
$bCenter | bool | Вырезать из центра |
{return} | LiveImage |
public function CropProportion(LiveImage $oImage,$iW,$iH,$bCenter=true) {
if(!$oImage || $oImage->get_last_error()) {
return false;
}
$iWidth = $oImage->get_image_params('width');
$iHeight = $oImage->get_image_params('height');
/**
* Если высота и ширина уже в нужных пропорциях, то возвращаем изначальный вариант
*/
$iProp=round($iW/$iH, 2);
if(round($iWidth/$iHeight, 2)==$iProp){ return $oImage; }
/**
* Вырезаем прямоугольник из центра
*/
if (round($iWidth/$iHeight, 2)<=$iProp) {
$iNewWidth=$iWidth;
$iNewHeight=round($iNewWidth/$iProp);
} else {
$iNewHeight=$iHeight;
$iNewWidth=$iNewHeight*$iProp;
}
if ($bCenter) {
$oImage->crop($iNewWidth,$iNewHeight,($iWidth-$iNewWidth)/2,($iHeight-$iNewHeight)/2);
} else {
$oImage->crop($iNewWidth,$iNewHeight,0,0);
}
/**
* Возвращаем объект изображения
*/
return $oImage;
}
Вырезает максимально возможный прямоугольный в нужной пропорции
public LiveImage CropSquare(LiveImage $oImage, $bCenter=true)
| ||
$oImage | LiveImage | Объект изображения |
$bCenter | ||
{return} | LiveImage |
public function CropSquare(LiveImage $oImage,$bCenter=true) {
if(!$oImage || $oImage->get_last_error()) {
return false;
}
$iWidth = $oImage->get_image_params('width');
$iHeight = $oImage->get_image_params('height');
/**
* Если высота и ширина совпадают, то возвращаем изначальный вариант
*/
if($iWidth==$iHeight){ return $oImage; }
/**
* Вырезаем квадрат из центра
*/
$iNewSize = min($iWidth,$iHeight);
if ($bCenter) {
$oImage->crop($iNewSize,$iNewSize,($iWidth-$iNewSize)/2,($iHeight-$iNewSize)/2);
} else {
$oImage->crop($iNewSize,$iNewSize,0,0);
}
/**
* Возвращаем объект изображения
*/
return $oImage;
}
Вырезает максимально возможный квадрат
public string GetIdDir(int $sId)
| ||
$sId | int | Целое число, обычно это ID пользователя |
{return} | string |
public function GetIdDir($sId) {
return Config::Get('path.uploads.images').'/'.preg_replace('~(.{2})~U', "\\1/", str_pad($sId, 6, "0", STR_PAD_LEFT)).date('Y/m/d');
}
Получает директорию для данного пользователя Используется фомат хранения данных (/images/us/er/id/yyyy/mm/dd/file.jpg)
public string GetLastError()
| ||
{return} | string |
public function GetLastError() {
return $this->sLastErrorText;
}
Получает текст последней ошибки
public string GetServerPath(string $sPath)
| ||
$sPath | string | WEB адрес изображения |
{return} | string |
public function GetServerPath($sPath) {
/**
* Определяем, принадлежит ли этот адрес основному домену
*/
if(parse_url($sPath,PHP_URL_HOST)!=parse_url(Config::Get('path.root.web'),PHP_URL_HOST)) {
return $sPath;
}
/**
* Выделяем адрес пути
*/
$sPath = ltrim(parse_url($sPath,PHP_URL_PATH),'/');
if($iOffset = Config::Get('path.offset_request_url')){
$sPath = preg_replace('#^([^/]+/*){'.$iOffset.'}#msi', '', $sPath);
}
return rtrim(Config::Get('path.root.server'),'/').'/'.$sPath;
}
Возвращает серверный адрес по переданному web-адресу
public string GetWebPath(string $sPath)
| ||
$sPath | string | Серверный адрес(путь) изображения |
{return} | string |
public function GetWebPath($sPath) {
$sServerPath = rtrim(str_replace(DIRECTORY_SEPARATOR,'/',Config::Get('path.root.server')),'/');
$sWebPath = rtrim(Config::Get('path.root.web'), '/');
return str_replace($sServerPath, $sWebPath, str_replace(DIRECTORY_SEPARATOR,'/',$sPath));
}
Возвращает WEB адрес по переданному серверному адресу
public void Init()
|
public function Init() {
$this->aParamsDefault = array(
'watermark_use'=>false,
'round_corner' =>false
);
}
Инициализация модуля
public bool RemoveFile(string $sFile)
| ||
$sFile | string | Полный серверный путь до файла |
{return} | bool |
public function RemoveFile($sFile) {
if (file_exists($sFile)) {
return unlink($sFile);
}
return false;
}
Удаление файла изображения
public string|bool Resize(string $sFileSrc, string $sDirDest, string $sFileDest, int $iWidthMax, int $iHeightMax, int|null $iWidthDest=NULL, int|null $iHeightDest=NULL, bool $bForcedMinSize=true, array|null $aParams=NULL, LiveImage|null $oImage=NULL)
| ||
$sFileSrc | string | Исходный файл изображения |
$sDirDest | string | Директория куда нужно сохранить изображение относительно корня сайта (path.root.server) |
$sFileDest | string | Имя файла для сохранения, без расширения |
$iWidthMax | int | Максимально допустимая ширина изображения |
$iHeightMax | int | Максимало допустимая высота изображения |
$iWidthDest | int|null | Ширина необходимого изображения на выходе |
$iHeightDest | int|null | Высота необходимого изображения на выходе |
$bForcedMinSize | bool | Растягивать изображение по ширине или нет, если исходное меньше. При false - изображение будет растянуто |
$aParams | array|null | Параметры |
$oImage | LiveImage|null | Объект изображения, если null то будет содано автоматически |
{return} | string|bool | Полный серверный путь до сохраненного изображения |
public function Resize($sFileSrc,$sDirDest,$sFileDest,$iWidthMax,$iHeightMax,$iWidthDest=null,$iHeightDest=null,$bForcedMinSize=true,$aParams=null,$oImage=null) {
$this->ClearLastError();
/**
* Если параметры не переданы, устанавливаем действия по умолчанию
*/
if(!is_array($aParams)) {
$aParams=$this->aParamsDefault;
}
/**
* Если объект не передан как параметр,
* создаем новый
*/
if(!$oImage) $oImage=$this->CreateImageObject($sFileSrc);
if($oImage->get_last_error()){
$this->SetLastError($oImage->get_last_error());
return false;
}
$sFileDest.='.'.$oImage->get_image_params('format');
if (($oImage->get_image_params('width')>$iWidthMax)
or ($oImage->get_image_params('height')>$iHeightMax)) {
return false;
}
if ($iWidthDest) {
if ($bForcedMinSize and ($iWidthDest>$oImage->get_image_params('width'))) {
$iWidthDest=$oImage->get_image_params('width');
}
/**
* Ресайзим и выводим результат в файл.
* Если не задана новая высота, то применяем масштабирование.
* Если нужно добавить Watermark, то запрещаем ручное управление alfa-каналом
*/
$oImage->resize($iWidthDest,$iHeightDest,(!$iHeightDest),(!$aParams['watermark_use']));
/**
* Добавляем watermark согласно в конфигурации заданым параметрам
*/
if($aParams['watermark_use']) {
if ($oImage->get_image_params('width')>$aParams['watermark_min_width'] and $oImage->get_image_params('height')>$aParams['watermark_min_height']) {
switch($aParams['watermark_type']) {
default:
case 'text':
$oImage->set_font(
$aParams['watermark_font_size'], 0,
$aParams['path']['fonts'].$aParams['watermark_font'].'.ttf'
);
$oImage->watermark(
$aParams['watermark_text'],
explode(',',$aParams['watermark_position'],2),
explode(',',$aParams['watermark_font_color']),
explode(',',$aParams['watermark_back_color']),
$aParams['watermark_font_alfa'],
$aParams['watermark_back_alfa']
);
break;
case 'image':
$oImage->paste_image(
$aParams['path']['watermarks'].$aParams['watermark_image'],
false, explode(',',$aParams['watermark_position'],2)
);
break;
}
}
}
/**
* Скругляем углы
*/
if($aParams['round_corner']) {
$oImage->round_corners($aParams['round_corner_radius'], $aParams['round_corner_rate']);
}
/**
* Для JPG формата устанавливаем output quality, если это предусмотрено в конфигурации
*/
if(isset($aParams['jpg_quality']) and $oImage->get_image_params('format')=='jpg') {
$oImage->set_jpg_quality($aParams['jpg_quality']);
}
$sFileTmp=Config::Get('sys.cache.dir').func_generator(20);
$oImage->output(null,$sFileTmp);
return $this->SaveFile($sFileTmp,$sDirDest,$sFileDest,0666,true);
} else{
return $this->SaveFile($sFileSrc,$sDirDest,$sFileDest,0666,false);
}
return false;
}
Resize,copy image, make rounded corners and add watermark
public bool SaveFile(string $sFileSource, string $sDirDest, string $sFileDest, int|null $iMode=NULL, bool $bRemoveSource=false)
| ||
$sFileSource | string | Полный путь до исходного файла |
$sDirDest | string | Каталог для сохранения файла относительно корня сайта |
$sFileDest | string | Имя файла для сохранения |
$iMode | int|null | Права chmod для файла, например, 0777 |
$bRemoveSource | bool | Удалять исходный файл или нет |
{return} | bool | | string |
public function SaveFile($sFileSource,$sDirDest,$sFileDest,$iMode=null,$bRemoveSource=false) {
$sFileDestFullPath=rtrim(Config::Get('path.root.server'),"/").'/'.trim($sDirDest,"/").'/'.$sFileDest;
$this->CreateDirectory($sDirDest);
$bResult=copy($sFileSource,$sFileDestFullPath);
if ($bResult and !is_null($iMode)) {
chmod($sFileDestFullPath,$iMode);
}
if ($bRemoveSource) {
unlink($sFileSource);
}
/**
* Если копирование прошло успешно, возвращаем новый серверный путь до файла
*/
if ($bResult) {
return $sFileDestFullPath;
}
return false;
}
Сохраняет(копирует) файл изображения на сервер Если переопределить данный метод, то можно сохранять изображения, например, на Amazon S3
public void SetLastError(string $sText)
| ||
$sText | string | Текст ошибки |
public function SetLastError($sText) {
$this->sLastErrorText=$sText;
}
Устанавливает текст последней ошибки