Files

273 lines
9.2 KiB
PHP
Raw Permalink Normal View History

2026-02-14 19:34:54 +03:00
<?php
//////////////////////////////////////////////////////////////////////////////
class Img
{
private $image;
private $fileExtension;
private $thumbnailName;
private $thumbnailDir;
public $quality = 80;
//////////////////////////////////////////////////////////////////////////
static public function get($filepath, $params = array()){
$thumbWidth = $params['width'] = isset($params['width']) ? $params['width'] : 112;
$thumbHeight = $params['height'] = isset($params['height']) ? $params['height'] : 112;
// $params['watermark'] = 'images/watermark.png';
if (empty($filepath))
{
return $filepath;
}
$filepath = $_SERVER['DOCUMENT_ROOT'].'/'.trim($filepath,'/');
if (!file_exists($filepath) || !is_file($filepath))
{
if (!file_exists($filepath) || !is_file($filepath))
{
return self::getLink($filepath);
}
}
$fileinfo = pathinfo($filepath);
$fileExtension = $fileinfo['extension'];
$thumbnailDir = dirname($filepath)."/thumbs";
if (!file_exists($thumbnailDir)) { mkdir($thumbnailDir); }
$thumbnailDir .= ($thumbWidth) ? "/".$thumbWidth : "/".$thumbHeight;
$thumbnailDir .= ($thumbHeight) ? "x".$thumbHeight : "x".$thumbWidth;
if (!file_exists($thumbnailDir)) { mkdir($thumbnailDir); }
$thumbnailName = $fileinfo['filename'].".".$fileExtension;
$thumbnailPath = "$thumbnailDir/$thumbnailName";
if (file_exists($thumbnailPath) &&
(filemtime($filepath) == filemtime($thumbnailPath)))
{
return self::getLink($thumbnailPath);
}
self::create($filepath, $thumbnailPath, $params);
return self::getLink($thumbnailPath);
}
public static function getMimeType($file,$magicFile=null,$checkExtension=true)
{
if(function_exists('finfo_open'))
{
$options=defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
$info=$magicFile===null ? finfo_open($options) : finfo_open($options,$magicFile);
if($info && ($result=finfo_file($info,$file))!==false)
return $result;
}
if(function_exists('mime_content_type') && ($result=mime_content_type($file))!==false)
return $result;
return $checkExtension ? self::getMimeTypeByExtension($file) : null;
}
public static function getMimeTypeByExtension($file,$magicFile=null)
{
if(($ext=pathinfo($file,PATHINFO_EXTENSION))!=='')
{
if($ext == 'jpeg' || $ext == 'JPEG') return 'image/jpeg';
if($ext == 'jpg' || $ext == 'JPG') return 'image/jpg';
if($ext == 'gif') return 'image/gif';
if($ext == 'png') return 'image/png';
}
return null;
}
//////////////////////////////////////////////////////////////////////////
private static function create($srcFilename, $dstFilename, $params)
{
$fillColor = isset($params['fillColor']) ? $params['fillColor'] : 0xFFFFFF;
$fileinfo = pathinfo($srcFilename);
$fileExtension = $fileinfo['extension'];
switch (strtolower(self::getMimeType($srcFilename)))
{
case 'image/jpg': $image = @imagecreatefromjpeg($srcFilename); $saveFn = 'imagejpeg'; $saveQuality = 80; break;
case 'image/jpeg': $image = @imagecreatefromjpeg($srcFilename); $saveFn = 'imagejpeg'; $saveQuality = 80; break;
case 'image/png': $image = @imagecreatefrompng($srcFilename); $saveFn = 'imagepng'; $saveQuality = 5; break;
case 'image/gif': $image = @imagecreatefromgif($srcFilename); $saveFn = 'imagepng'; $saveQuality = NULL; break;
default: return;
//throw new CException("Unable to create thumbnail. Unsupported image format: $fileExtension");
}
if (!$image)
{
//throw new CException("Unable to create thumbnail. imagecreatefromXXX function failed");
}
$imgWidth = imagesx($image);
$imgHeight = imagesy($image);
if (isset($params['crop']) && $params['crop'])
{
$imgScale = $imgWidth/$imgHeight;
$thumbScale = $params['width']/$params['height'];
if ($imgScale <= $thumbScale)
{
$imgHeight = $imgWidth/$thumbScale;
}
else
{
$imgWidth = $imgHeight*$thumbScale;
}
}
if (isset($params['min-width']) && ($params['min-width'] > $imgWidth)) $params['width'] = $params['min-width'];
if (isset($params['min-height']) && ($params['min-height'] > $imgHeight)) $params['height'] = $params['min-height'];
$thumbGeometry = self::getThumbnailGeometry($imgWidth, $imgHeight, $params['width'], $params['height']);
$thumbImage = imagecreatetruecolor($thumbGeometry['width'] + $thumbGeometry['padding-left']*2,
$thumbGeometry['height'] + $thumbGeometry['padding-top']*2);
if ($thumbGeometry['padding-top'] || $thumbGeometry['padding-left'])
{
$fcolor = imagecolorallocate($thumbImage, ($fillColor >> 16) & 0xFF,
($fillColor >> 8) & 0xFF,
($fillColor >> 0) & 0xFF);
imagefill($thumbImage, 0,0, $fcolor);
}
if (!$thumbImage)
{
//throw new CException("imagecreatetruecolor function failed");
}
if (($fileExtension == "gif") || ($fileExtension == "png"))
{
imagecolortransparent($thumbImage, imagecolorallocatealpha($thumbImage, 0, 0, 0, 127));
imagealphablending($thumbImage, false);
imagesavealpha($thumbImage, true);
}
if (!imagecopyresampled($thumbImage, $image, $thumbGeometry['padding-left'], $thumbGeometry['padding-top'], 0, 0,
$thumbGeometry['width'], $thumbGeometry['height'], $imgWidth, $imgHeight))
{
//throw new CException("Unable to create thumbnail. imagecopyresized function failed");
}
///////////////////////////////
// $params['watermark'] = '/themes/ecofermer/images/watermark/watermark.png';
//$params['watermarkPosition'] = 'center center';
self::applyWatermark($thumbImage, $thumbGeometry, $params);
if (!$saveFn($thumbImage, $dstFilename, $saveQuality))
{
//throw new CException("Unable to create thumbnail. imagexxx function failed");
}
$srcTime = filemtime($srcFilename);
touch($dstFilename, $srcTime);
}
//////////////////////////////////////////////////////////////////////////
protected static function applyWatermark($img, $imgGeometry, $params)
{
if (!isset($params['watermark']))
{
return false;
}
else if ($params['watermark'] === true)
{
//$watermarkFile = Yii::getPathOfAlias('webroot')."/".Yii::app()->params['watermarkFile'];
}
else if (is_string($params['watermark']))
{
$watermarkFile = $_SERVER['DOCUMENT_ROOT'].'/'.$params['watermark'];
}
else
{
return;
}
if (!file_exists($watermarkFile) || !($wtmkImg = imagecreatefrompng($watermarkFile)))
{
return;
}
$wtmkWidth = imagesx($wtmkImg);
$wtmkHeight = imagesy($wtmkImg);
$scale = min( $imgGeometry['width']/$wtmkWidth,$imgGeometry['height']/$wtmkHeight)*0.5;
$scaledThumbWidth = $scale < 1.0 ? $scale * $wtmkWidth : $wtmkWidth;
$scaledThumbHeight = $scale < 1.0 ? $scale * $wtmkHeight : $wtmkHeight;
$centerX = ($imgGeometry['width'] - $scaledThumbWidth)/2;
$centerY = ($imgGeometry['height'] - $scaledThumbHeight)/2;
imagealphablending($img, true);
imagealphablending($wtmkImg, true);
if (!imagecopyresampled($img, $wtmkImg,
$centerX + $imgGeometry['padding-left'], $centerY + $imgGeometry['padding-top'], 0, 0,
$scaledThumbWidth, $scaledThumbHeight, $wtmkWidth, $wtmkHeight))
{
//throw new CException("Unable to create thumbnail. imagecopyresized function failed");
}
}
//////////////////////////////////////////////////////////////////////////
protected static function getThumbnailGeometry($imgWidth, $imgHeight, $thumbWidth, $thumbHeight)
{
$retval = array('width'=>0, 'height'=>0, 'padding-top'=>0, 'padding-left'=>0);
if (!$thumbWidth && !$thumbHeight)
{
$retval['width'] = $imgWidth;
$retval['height'] = $imgHeight;
}
else if ($thumbWidth && !$thumbHeight)
{
$retval['width'] = $thumbWidth;
$retval['height'] = floor($imgHeight*($thumbWidth / $imgWidth));
}
else if (!$thumbWidth && $thumbHeight)
{
$retval['height']= $thumbHeight;
$retval['width'] = floor($imgWidth*($thumbHeight / $imgHeight));
}
else
{
$scale = min( $thumbWidth/$imgWidth, $thumbHeight/$imgHeight );
$retval['width'] = $scale < 1.0 ? $scale * $imgWidth : $imgWidth;
$retval['height'] = $scale < 1.0 ? $scale * $imgHeight : $imgHeight;
$retval['padding-left'] = ($thumbWidth - $retval['width'])/2;
$retval['padding-top'] = ($thumbHeight - $retval['height'])/2;
}
return $retval;
}
//////////////////////////////////////////////////////////////////////////
private static function getLink($path)
{
if (substr($path, 0, strlen($_SERVER['DOCUMENT_ROOT'].'/')) == $_SERVER['DOCUMENT_ROOT'].'/')
{
$path = substr($path, strlen($_SERVER['DOCUMENT_ROOT'].'/'));
}
$path = '/'.ltrim($path,'/');
return $path;
}
}