1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-08 09:24:25 +03:00
ifhub.club/engine/modules/image/Image.class.php

265 lines
7.9 KiB
PHP
Raw Normal View History

<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
require_once Config::Get('path.root.engine').'/lib/external/LiveImage/Image.php';
/**
* Модуль обработки изображений
* Использует библиотеку LiveImage
*
*/
class LsImage extends Module {
/**
* Неопределенный тип ошибки при загрузке изображения
*/
const UPLOAD_IMAGE_ERROR = 1;
/**
* Ошибка избыточного размера при загрузке изображения
*/
const UPLOAD_IMAGE_ERROR_SIZE = 2;
/**
* Неизвестный тип изображения
*/
const UPLOAD_IMAGE_ERROR_TYPE = 4;
/**
* Ошибка чтения файла при загрузке изображения
*/
const UPLOAD_IMAGE_ERROR_READ = 8;
/**
* Настройки модуля по умолчанию
*
* @var array
*/
protected $aParamsDefault = array();
/**
* Инициализация модуля
*/
public function Init() {
$this->aParamsDefault = array(
'watermark_use'=>false,
'round_corner' =>false
);
}
/**
* Merge default and named params for images
*
* @param string $sName
* @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);
}
/**
* Resize,copy image,
* make rounded corners and add watermark
*
* @param string $sFileSrc
* @param string $sDirDest
* @param string $sFileDest
* @param int $iWidthMax
* @param int $iHeightMax
* @param int $iWidthDest
* @param int $iHeightDest
* @param bool $bForcedMinSize
* @param array $aParams
* @param object $oImage
* @return string
*/
public function Resize($sFileSrc,$sDirDest,$sFileDest,$iWidthMax,$iHeightMax,$iWidthDest=null,$iHeightDest=null,$bForcedMinSize=true,$aParams=null,$oImage=null) {
/**
* Если параметры не переданы, устанавливаем действия по умолчанию
*/
if(!is_array($aParams)) {
$aParams=$this->aParamsDefault;
}
/**
* Если объект не передан как параметр,
* создаем новый
*/
if(!$oImage) $oImage=new LiveImage($sFileSrc);
if($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;
}
$sFileFullPath=trim(Config::Get('path.root.server'),"/").'/'.trim($sDirDest,"/").'/'.$sFileDest;
@func_mkdir(Config::Get('path.root.server'),$sDirDest);
if ($iWidthDest) {
2009-10-22 01:27:23 +03:00
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']) {
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'],
true, explode(',',$aParams['watermark_position'],2)
);
break;
}
}
/**
* Скругляем углы
*/
if($aParams['round_corner']) {
$oImage->round_corners(
$aParams['round_corner_radius'],
$aParams['round_corner_rate']
);
}
$oImage->output(null,$sFileFullPath);
chmod($sFileFullPath,0666);
return $sFileFullPath;
} elseif (copy($sFileSrc,$sFileFullPath)) {
chmod($sFileFullPath,0666);
return $sFileFullPath;
}
return false;
}
/**
* Вырезает максимально возможный квадрат
*
* @param LiveImage $oImage
* @return LiveImage
*/
public function CropSquare(LiveImage $oImage) {
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);
$oImage->crop($iNewSize,$iNewSize,($iWidth-$iNewSize)/2,($iHeight-$iNewSize)/2);
/**
* Возвращаем объект изображения
*/
return $oImage;
}
/**
* Возвращает серверный адрес по переданному web-адресу
*
* @param string $sPath
* @return string
*/
public function GetServerPath($sPath) {
return str_replace(Config::Get('path.root.web'), Config::Get('path.root.server'), $sPath);
}
/**
* Возвращает серверный адрес по переданному web-адресу
*
* @param string $sPath
* @return string
*/
public function GetWebPath($sPath) {
return str_replace(rtrim(Config::Get('path.root.server'),'/'), rtrim(Config::Get('path.root.web'),'/'), $sPath);
}
/**
* Получает директорию для данного пользователя
* Используется фомат хранения данных (/images/us/er/id/yyyy/mm/dd/file.jpg)
*
* @param string $sUserId
* @return string
*/
public function GetUserDir($sUserId) {
return Config::Get('path.uploads.images').'/'.preg_replace('~(.{2})~U', "\\1/", str_pad($sUserId, 6, "0", STR_PAD_LEFT)).date('Y/m/d');
}
/**
* Возвращает валидный Html код тега <img>
*
* @param string $sPath
* @param array $aParams
* @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'))) {
$sText.=' align="'.htmlspecialchars($aParams['align']).'" ';
}
$sAlt = isset($aParams['alt'])
? ' alt="'.htmlspecialchars($aParams['alt']).'"'
: ' alt=""';
$sText.=$sAlt.' />';
return $sText;
}
/**
* Завершение работы модуля
*/
public function Shutdown() {
}
}
?>