add LE_IMG class and documentation
This commit is contained in:
248
CLASSES/core/LE_IMG.php
Normal file
248
CLASSES/core/LE_IMG.php
Normal file
@@ -0,0 +1,248 @@
|
||||
<?php
|
||||
/**
|
||||
* Author: Pavel Belyaev
|
||||
* GitHub: https://github.com/TechResearchRu/LE_DRAFT
|
||||
* Email: pavelbbb@gmail.com
|
||||
* LE FRAMEWORK, LE_IMG v0.1 2021, need GD module in PHP
|
||||
*/
|
||||
|
||||
class LE_IMG
|
||||
{
|
||||
|
||||
public static function LOAD($p)
|
||||
{
|
||||
if (!file_exists($p) || !is_file($p)) return false;
|
||||
|
||||
list($w,$h,$t) = getimagesize($p);
|
||||
|
||||
switch ($t)
|
||||
{
|
||||
case 1:$obj = imagecreatefromgif($p);break;
|
||||
case 2:$obj = imagecreatefromjpeg($p);break;
|
||||
case 3:$obj = imagecreatefrompng($p);break;
|
||||
default: return false; break;
|
||||
}
|
||||
|
||||
return [$w,$h,$t,&$obj];
|
||||
}
|
||||
|
||||
public static function SAVE (&$o,$t,$p)
|
||||
{
|
||||
switch ( $t )
|
||||
{
|
||||
case 1: imagegif($o,$p); break;
|
||||
case 2: imagejpeg($o,$p); break;
|
||||
case 3: imagepng($o,$p); break;
|
||||
}
|
||||
imageDestroy($o);
|
||||
unset($o);
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
//list($_w,$_h) =LE_IMG::calc_prop($w,$h,$w_out,$h_out,$maximize)
|
||||
public static function calc_prop($w,$h,$w_out,$h_out,$max=0)
|
||||
{
|
||||
$r = $h/$w; //отношение высоты к ширине
|
||||
|
||||
if ($max && ($w<$w_out||$h<$h_out))
|
||||
{
|
||||
if (($w_out>0) && ($w<$w_out) && ($w=$w_out)) $h = Ceil($w*$r);
|
||||
if (($h_out>0) && ($h<$h_out) && ($h=$h_out)) $w = Ceil($h*pow($r,-1));
|
||||
}
|
||||
|
||||
//если ширина не вписалась, уменьшаем ширину, а высоту пропорционально
|
||||
if (($w_out>0) && ($w>$w_out))
|
||||
{
|
||||
$w=$w_out;
|
||||
$h = Ceil($w*$r);
|
||||
}
|
||||
//если высота не вписалась, уменьшаем высоту, а ширину пропорционально
|
||||
if (($h_out>0) && ($h>$h_out))
|
||||
{
|
||||
$h=$h_out;
|
||||
$w = Ceil($h*pow($r,-1));
|
||||
}
|
||||
return [$w,$h]; //x,y
|
||||
}
|
||||
|
||||
public static function calc_prop2($w,$h,$w_out,$h_out)
|
||||
{
|
||||
$_w = $w/$w_out;
|
||||
$_h = $h/$h_out;
|
||||
$r = $h/$w;
|
||||
|
||||
if($_w<$_h)
|
||||
{
|
||||
$w = $w_out;
|
||||
$h = Ceil($w*$r);
|
||||
}
|
||||
else
|
||||
{
|
||||
$h=$h_out;
|
||||
$w = Ceil($h*pow($r,-1));
|
||||
}
|
||||
|
||||
return [$w,$h];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//LE_IMG::resize ($in,$out,$mw=0,$mh=0);
|
||||
public static function resize ($in,$out,$mw=0,$mh=0)
|
||||
{
|
||||
if (!file_exists($in)) return false;
|
||||
$__load = LE_IMG::load($in);
|
||||
if ($__load===false) return false;
|
||||
list($w,$h,$t,$obj) = $__load;
|
||||
$nw=$w; $nh=$h;
|
||||
if (($mw>0) && ($w>$mw) && ($nw=$mw)) $nh = Ceil($nw*$h/$w);
|
||||
if (($mh>0) && ($nh>$mh) && ($nh=$mh)) $nw = Ceil($nh*$w/$h);
|
||||
$resource = imagecreatetruecolor ($nw,$nh); //создаем лист по новым размерам
|
||||
imagealphablending($resource, false);
|
||||
imagecopyresampled ($resource,$obj,0,0,0,0,$nw,$nh,$w,$h);
|
||||
imageSaveAlpha($resource, true);
|
||||
LE_IMG::save($resource,$t,$out);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function resize_crop ($in,$out,$mw=0,$mh=0)
|
||||
{
|
||||
if (!file_exists($in)) return false;
|
||||
$__load = LE_IMG::load($in);
|
||||
if ($__load===false) return false;
|
||||
|
||||
list($w,$h,$t,$obj) = $__load;
|
||||
|
||||
list($nw,$nh) = LE_IMG::calc_prop2($w,$h,$mw,$mh);
|
||||
|
||||
|
||||
//resize
|
||||
$resource = imagecreatetruecolor ($nw,$nh); //создаем лист по новым размерам
|
||||
imagealphablending($resource, false);
|
||||
imagecopyresampled ($resource,$obj,0,0,0,0,$nw,$nh,$w,$h);
|
||||
imageSaveAlpha($resource, true);
|
||||
|
||||
//crop
|
||||
$cr = array('width'=>$mw,'height'=>$mh);
|
||||
$cr['x'] = Ceil(($nw-$mw)/2);
|
||||
$cr['y'] = Ceil(($nh-$mh)/2);
|
||||
$resource = imagecrop($resource,$cr);
|
||||
|
||||
LE_IMG::save($resource,$t,$out);
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
//срезка кусочков изображения со всех сторон
|
||||
public static function crop ($in,$out,$l=0,$t=0,$r=0,$b=0)
|
||||
{
|
||||
/*открытие*/
|
||||
list($w,$h,$t,$obj) = LE_IMG::load($in);
|
||||
|
||||
/*новые размеры*/
|
||||
$n_w=$w-$l-$r; $n_h=$h-$t-$b;
|
||||
|
||||
$res = imagecreatetruecolor($n_w,$n_h);
|
||||
imagealphablending($res,false);
|
||||
imagecopy ($res,$obj,0,0,$l,$t,$n_w,$n_h);
|
||||
imageSaveAlpha($res, true);
|
||||
|
||||
LE_IMG::save($res,$t,$out);
|
||||
}
|
||||
|
||||
public static function fix_color($w,$h,&$img)
|
||||
{
|
||||
//fix for png not truecolor
|
||||
$uig = imagecreatetruecolor($w, $h);
|
||||
imageSaveAlpha($uig, true);
|
||||
//$transparent = imagecolortransparent ($img);
|
||||
$transparent = imagecolorallocatealpha($uig,255,255,255,127);
|
||||
imagefill($uig, 0, 0, $transparent);
|
||||
imagecopy($uig, $img, 0, 0, 0, 0, $w, $h);
|
||||
return $uig;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static function watermark1($url,$conf)
|
||||
{
|
||||
//return LE_IMG::demo_water($url,$conf);
|
||||
if (!is_file($url)) exit('Нет файла для наложения watermark');
|
||||
$__load = LE_IMG::load($url);
|
||||
if ($__load===false) return false;
|
||||
|
||||
list($w,$h,$t,$src_img) = $__load;
|
||||
|
||||
//fix for png not truecolor
|
||||
if (imageistruecolor($src_img)===false)
|
||||
{
|
||||
$uig = LE_IMG::fix_color($w,$h,$src_img);
|
||||
imagedestroy($src_img);
|
||||
}
|
||||
else
|
||||
$uig = &$src_img;
|
||||
|
||||
$txt_w = $w*0.9; $txt_h = $h*0.9;
|
||||
if (!isset($conf['rgb'])) $conf['rgb'] = '78,78,78,40';
|
||||
$col = explode(',',$conf['rgb']);
|
||||
$text = " ".$conf['text']." ";
|
||||
$angle = -rad2deg(atan2((-$h),($w)));
|
||||
|
||||
$color = imagecolorclosestalpha ($uig, $col[0], $col[1], $col[2], $col[3]);
|
||||
$size = (($txt_w+$txt_h)/2)*2/mb_strlen(" ".$text." ");
|
||||
|
||||
$fnt = $conf['font'];
|
||||
$box = imagettfbbox ( $size, $angle, $fnt, $text);
|
||||
$pad_left = ($txt_w/2 - abs($box[4] - $box[0])/2);
|
||||
$pad_top = ($txt_h/2 + abs($box[5] - $box[1])/2);
|
||||
|
||||
imagettftext($uig,$size ,$angle, $pad_left,$pad_top , $color, $fnt, $text);
|
||||
|
||||
LE_IMG::save($uig,$t,$url);
|
||||
return;
|
||||
}
|
||||
|
||||
public static function watermark2($url,$stamp_path,$skeep_err=1)
|
||||
{
|
||||
if (!is_file($url))
|
||||
{
|
||||
if ($skeep_err) return false;
|
||||
exit('Нет файла для наложения watermark');
|
||||
}
|
||||
|
||||
$__load = LE_IMG::load($url);
|
||||
if ($__load===false) return false;
|
||||
|
||||
list($w,$h,$t,$src_img) = $__load;
|
||||
|
||||
//fix for png not truecolor
|
||||
if (imageistruecolor($src_img)===false)
|
||||
{
|
||||
$uig = LE_IMG::fix_color($w,$h,$src_img);
|
||||
imagedestroy($src_img);
|
||||
}
|
||||
else
|
||||
$uig = &$src_img;
|
||||
|
||||
$_stamp = LE_IMG::load($stamp_path);
|
||||
|
||||
if ($_stamp===false) return false;
|
||||
|
||||
list($st_w,$st_h,$st_t,$stamp) = $_stamp;
|
||||
|
||||
|
||||
list($_w,$_h) = LE_IMG::calc_prop($st_w,$st_h,$w,$h,1);
|
||||
|
||||
$dst_x = $dst_y =0;
|
||||
if ($_w<$w) $dst_x = ceil(($w-$_w)/2);
|
||||
if ($_h<$h) $dst_y = ceil(($h-$_h)/2);
|
||||
|
||||
imagecopyresampled ($uig,$stamp,$dst_x, $dst_y,0,0,$_w,$_h,$st_w,$st_h);
|
||||
|
||||
LE_IMG::save($uig,$t,$url);
|
||||
imagedestroy($stamp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user