/** * Upload user avatar on server * Make resized images * * @param array $aFile * @param ModuleUser_EntityUser $oUser * @return (string|bool) */ public function UploadAvatar($aFile, $oUser) { if (!is_array($aFile) || !isset($aFile['tmp_name'])) { return false; } $sFileTmp = Config::Get('sys.cache.dir') . func_generator(); if (!move_uploaded_file($aFile['tmp_name'], $sFileTmp)) { return false; } $sPath = $this->Image_GetIdDir($oUser->getId()); $aParams = $this->Image_BuildParams('avatar'); /** * Срезаем квадрат */ $oImage = new LiveImage($sFileTmp); /** * Если объект изображения не создан, * возвращаем ошибку */ if ($sError = $oImage->get_last_error()) { // Вывод сообщения об ошибки, произошедшей при создании объекта изображения // $this->Message_AddError($sError,$this->Lang_Get('error')); @unlink($sFileTmp); return false; } $oImage = $this->Image_CropSquare($oImage); $oImage->set_jpg_quality($aParams['jpg_quality']); $oImage->output(null, $sFileTmp); if ($sFileAvatar = $this->Image_Resize($sFileTmp, $sPath, 'avatar_100x100', Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), 100, 100, false, $aParams)) { $aSize = Config::Get('module.user.avatar_size'); foreach ($aSize as $iSize) { if ($iSize == 0) { $this->Image_Resize($sFileTmp, $sPath, 'avatar', Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), null, null, false, $aParams); } else { $this->Image_Resize($sFileTmp, $sPath, "avatar_{$iSize}x{$iSize}", Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), $iSize, $iSize, false, $aParams); } } @unlink($sFileTmp); /** * Если все нормально, возвращаем расширение загруженного аватара */ return $this->Image_GetWebPath($sFileAvatar); } @unlink($sFileTmp); /** * В случае ошибки, возвращаем false */ return false; }
/** * Загрузить изображение * @param type $aFile * @return string */ public function UploadTopicPhoto($aFile) { if (!is_array($aFile) || !isset($aFile['tmp_name'])) { return false; } $sFileName = func_generator(10); $sPath = Config::Get('path.uploads.images') . '/topic/' . date('Y/m/d') . '/'; if (!is_dir(Config::Get('path.root.server') . $sPath)) { mkdir(Config::Get('path.root.server') . $sPath, 0755, true); } $sFileTmp = Config::Get('path.root.server') . $sPath . $sFileName; if (!move_uploaded_file($aFile['tmp_name'], $sFileTmp)) { return false; } $aParams = $this->Image_BuildParams('photoset'); $oImage = new LiveImage($sFileTmp); /** * Если объект изображения не создан, * возвращаем ошибку */ if ($sError = $oImage->get_last_error()) { // Вывод сообщения об ошибки, произошедшей при создании объекта изображения $this->Message_AddError($sError, $this->Lang_Get('error')); @unlink($sFileTmp); return false; } /** * Превышает максимальные размеры из конфига */ if ($oImage->get_image_params('width') > Config::Get('view.img_max_width') or $oImage->get_image_params('height') > Config::Get('view.img_max_height')) { $this->Message_AddError($this->Lang_Get('topic_photoset_error_size'), $this->Lang_Get('error')); @unlink($sFileTmp); return false; } // Добавляем к загруженному файлу расширение $sFile = $sFileTmp . '.' . $oImage->get_image_params('format'); rename($sFileTmp, $sFile); $aSizes = Config::Get('module.topic.photoset.size'); foreach ($aSizes as $aSize) { // Для каждого указанного в конфиге размера генерируем картинку $sNewFileName = $sFileName . '_' . $aSize['w']; $oImage = new LiveImage($sFile); if ($aSize['crop']) { $this->Image_CropProportion($oImage, $aSize['w'], $aSize['h'], true); $sNewFileName .= 'crop'; } $this->Image_Resize($sFile, $sPath, $sNewFileName, Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), $aSize['w'], $aSize['h'], true, $aParams, $oImage); } return $this->Image_GetWebPath($sFile); }
/** * Вырезает максимально возможный квадрат * * @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; }
/** * Вырезает максимально возможный прямоугольный в нужной пропорции * * @param LiveImage $oImage Объект изображения * @param int $iW Ширина для определения пропорции * @param int $iH Высота для определения пропорции * @param bool $bCenter Вырезать из центра * @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; }
/** * Upload blog avatar on server * Make resized images * * @param array $aFile * @param ModuleBlog_EntityBlog $oUser * @return (string|bool) */ public function UploadBlogAvatar($aFile, $oBlog) { if (!is_array($aFile) || !isset($aFile['tmp_name'])) { return false; } $sFileTmp = Config::Get('sys.cache.dir') . func_generator(); if (!move_uploaded_file($aFile['tmp_name'], $sFileTmp)) { return false; } $sPath = $this->Image_GetIdDir($oBlog->getOwnerId()); $aParams = $this->Image_BuildParams('avatar'); $oImage = new LiveImage($sFileTmp); /** * Если объект изображения не создан, * возвращаем ошибку */ if ($sError = $oImage->get_last_error()) { // Вывод сообщения об ошибки, произошедшей при создании объекта изображения // $this->Message_AddError($sError,$this->Lang_Get('error')); @unlink($sFileTmp); return false; } /** * Срезаем квадрат */ $oImage = $this->Image_CropSquare($oImage); $aSize = Config::Get('module.blog.avatar_size'); rsort($aSize, SORT_NUMERIC); $sSizeBig = array_shift($aSize); if ($oImage && ($sFileAvatar = $this->Image_Resize($sFileTmp, $sPath, "avatar_blog_{$oBlog->getUrl()}_{$sSizeBig}x{$sSizeBig}", Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), $sSizeBig, $sSizeBig, false, $aParams, $oImage))) { foreach ($aSize as $iSize) { if ($iSize == 0) { $this->Image_Resize($sFileTmp, $sPath, "avatar_blog_{$oBlog->getUrl()}", Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), null, null, false, $aParams, $oImage); } else { $this->Image_Resize($sFileTmp, $sPath, "avatar_blog_{$oBlog->getUrl()}_{$iSize}x{$iSize}", Config::Get('view.img_max_width'), Config::Get('view.img_max_height'), $iSize, $iSize, false, $aParams, $oImage); } } @unlink($sFileTmp); /** * Если все нормально, возвращаем расширение загруженного аватара */ return $this->Image_GetWebPath($sFileAvatar); } @unlink($sFileTmp); /** * В случае ошибки, возвращаем false */ return false; }