php 方便水印和缩略图的图形类

前端之家收集整理的这篇文章主要介绍了php 方便水印和缩略图的图形类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<div class="codetitle"><a style="CURSOR: pointer" data="80273" class="copybut" id="copybut80273" onclick="doCopy('code80273')"> 代码如下:

<div class="codebody" id="code80273">
<?PHP /
@author夜无眠27262681@qq.com
copyrighthttp://www.gowake.cn
/ class img {
function __construct($arg = null) {
$args = func_get_args();
if($arg == null) {
return null;
}
$this->im = call_user_func_array(array($this,'create'),$args);
} function __call($func,$arg) {
if(function_exists('image'.$func)) {
$funcstr = 'image'.$func;
}elseif (function_exists($func)){
$funcstr = $func;
}else {
error("没有这个类方法函数");
}
return call_user_func_array($funcstr,$arg);
} /
创建图像
@param string/int 图片文件路径或者宽度
@param int 高度,可省略
@param string 6位16进制整数
/
function create($arg = null) {
$args = func_get_args();
if(is_file($args[0])) {
$this->file = $args[0];
$size = getimagesize($this->file) or error('图片类型错误');
$this->size = $this->size ? $this->size : $size;
$type = image_type_to_extension($size[2],false);
$this->type = $this->type ? $this->type : $type;
$createfunc = 'imagecreatefrom'.$type;
$im = $createfunc($this->file);
}elseif((int)$args[0]>0 and (int)$args[1]>0) {
$im = imagecreatetruecolor((int)$args[0],(int)$args[1]) or error("对不起,参数错误!");
if(!$args[2]) {
$color = hexdec('7fffffff');
imagecolortransparent($im,$color);
}else {
$color = hexdec(str_replace('#','',$args[2]));
}
$this->size = $this->size ? $this->size : array((int)$args[0],(int)$args[1]);
imagefill($im,1,$color);
}else {
error("对不起,参数错误!");
}
//imagealphablending($im,false);//这两行用来记录透明通道
imagesavealpha($im,true);
imageinterlace($im,true);//开启隔行扫描
return $im;
} /
生成缩略图
@param int $w 新图片的宽度
@param int $h 新图片的宽度
@param string/bool $color 可选,新图片的背景色,false或空为透明
@param bool $lashen 可选,是否拉伸,默认不拉伸
/
function suolue($w = null,$h = null,$color = false,$lashen = false) {
$w_o = imagesx($this->im);
$h_o = imagesy($this->im);
if($w == null and $h != null) {
$w = $h
$w_o/$h_o;
}elseif ($w != null and $h == null){
$h = $w $h_o/$w_o;
}
$this->size = null;
$im = $this->create($w,$h,$color);
$w_n = $w;
$h_n = $h;
if($w_o/$h_o > $w/$h) {
$h_n = $w
$h_o/$w_o;
$y = ($h-$h_n)/2;
}elseif ($w_o/$h_o < $w/$h){
$w_n = $h$w_o/$h_o;
$x = ($w-$w_n)/2;
}
if($lashen) {
$w_n = $w;
$h_n = $h;
$x = 0;
$y = 0;
}
imagecopyresampled($im,$this->im,$x,$y,$w_n,$h_n,$w_o,$h_o);
//imagedestroy($this->im);
$this->im = $im;
return $im;
} /

图片上写字
@param string $str 要写的字符串
@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;angle为角度,color为6位数16进制颜色,touming为文字透明度,font为字体文件
/
function write($str = '',$arg = array()) {
$size = $arg['size'] ? $arg['size'] : 20;
$angle = $arg['angle'] ? $arg['angle'] : 0 ;
$color = $arg['color'] ? $arg['color'] : '000000';
$touming = $arg['touming'] ? $arg['touming'] : 100;
$touming = dechex((100-$touming)127/100);
$color = hexdec($touming.str_replace("#","",$color));
$font = $arg['font'] ? $arg['font'] : 'arial.ttf';
$Boxarr = imagettfbBox($size,$angle,$font,$str);
$w = imagesx($this->im);
$h = imagesy($this->im); $x_l = $x_r = $Boxarr[0];
$y_t = $y_b = $Boxarr[1];
for($i=0;$i<7;$i = $i+2) {
$x_l = $Boxarr[$i] < $x_l ? $Boxarr[$i] : $x_l;
$x_r = $Boxarr[$i] > $x_r ? $Boxarr[$i] : $x_r;
$y_t = $Boxarr[$i+1] < $y_t ? $Boxarr[$i+1] : $y_t;
$y_b = $Boxarr[$i+1] > $y_b ? $Boxarr[$i+1] : $y_b;
}
$width = $x_r - $x_l;
$height = $y_b - $y_t; /
获取精确偏移量/
$im = $this->create($width
4,$height4);
$tm = hexdec('7fffffff');
imagettftext($im,$size,$width
2,$height2,$color,$str);
for($i=0;$i<$width
4;$i++) {
for($ii=0;$ii<$height4;$ii++) {
if(imagecolorat($im,$i,$ii) != $tm) {
$x_l = $i;
break(2);
}
}
}
for($i=0;$i<$height
4;$i++) {
for($ii=$x_l;$ii<$width4;$ii++) {
if(imagecolorat($im,$ii,$i) != $tm) {
$y_t = $i;
break(2);
}
}
}
for($i=$width
4-1;$i>0;$i--) {
for($ii=$y_t;$ii<$height4;$ii++) {
if(imagecolorat($im,$ii) != $tm) {
$x_r = $i;
break(2);
}
}
}
for($i=$height
4-1;$i>0;$i--) {
for($ii=$x_l;$ii<=$x_r;$ii++) {
if(imagecolorat($im,$i) != $tm) {
$y_b = $i;
break(2);
}
}
}
$x_off = $x_l - $width2;
$y_off = $y_b - $height
2;
$width = $x_r - $x_l; //精确宽度
$height = $y_b - $y_t; //精确高度
imagedestroy($im); if(isset($arg['left'])) {
$x = (int)$arg['left'] - $x_off;
}elseif (isset($arg['right'])){
$x = $w - (int)$arg['right'] - $width - $x_off;
}else {
$x = ($w - $width)/2 - $x_off;
}
if(isset($arg['top'])) {
$y = (int)$arg['top'] - $y_off + $height;
}elseif (isset($arg['bottom'])){
$y = $h - (int)$arg['bottom'] - $y_off;
}else {
$y = ($h + $height)/2 - $y_off;
} imagettftext($this->im,$str);
return $this->im;
} /
合并图片(如图片水影)
@param string/resource $file 图片文件路径或这图片标识符
@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;touming为文字透明度
/
function merge($file,$arg = array()) {
if(is_file($file)) {
$imc = $this->create($file);
}elseif(gettype($file)=='resource') {
$imc = $file;
}else {
error("没有图片");
}
$touming = $arg['touming'] ? (int)$arg['touming'] : 100 ;
$w = imagesx($this->im);
$h = imagesy($this->im);
$width = imagesx($imc);
$height = imagesy($imc);
if(isset($arg['left'])) {
$x = (int)$arg['left'];
}elseif (isset($arg['right'])){
$x = $w - (int)$arg['right'] - $width;
}else {
$x = ($w - $width)/2;
}
if(isset($arg['top'])) {
$y = (int)$arg['top'];
}elseif (isset($arg['bottom'])){
$y = $h - $height - $arg['bottom'];
}else {
$y = ($h - $height)/2;
}
imagecopymergegray($this->im,$imc,$width,$height,$touming);
} /

输出图片
@param string $type
@param string $filename 要转存的文件路径
@param int $zhiliang jpeg图片特有的,图像清晰度
/
function display($type = null,$filename = null,$zhiliang = null) {
if($type == null) {
$type = $this->type ? $this->type : 'jpg';
}
if(($type == 'jpeg' or $type == 'jpg') and $zhiliang == null) {
$type = 'jpeg';
$zhiliang = 100;
}
if($filename == null) {
header('Content-type: image/'.$type);
}
$displayfunc = 'image'.$type;
$displayfunc($this->im,$filename,$zhiliang);
imagedestroy($this->im);
} function randcolor($a,$b) {
$a = $a>255 ? 255 : (int)$a;
$a = $a<0 ? 0 : (int)$a;
$b = $b>255 ? 255 : (int)$b;
$b = $b<0 ? 0 : (int)$b;
for($i=0;$i<3;$i++) {
$color .= str_pad(dechex(mt_rand($a,$b)),2,"0",STR_PAD_LEFT);
}
return $color;
}
} /

function error($msg,$debug = false) {
$err = new Exception($msg);
$str = "
\n<span style="color:red" style="color:red">错误:\n".print_r($err->getTrace(),1)."\n
";
if($debug == true) {
file_put_contents(date('Y-m-d').".log",$str);
return $str;
}else{
die($str);
}
}
*/
?>

这是简单的用法实例
<div class="codetitle"><a style="CURSOR: pointer" data="71987" class="copybut" id="copybut71987" onclick="doCopy('code71987')"> 代码如下:
<div class="codebody" id="code71987">
$img = new img('a.png');
$m = $img->im;
$im = $img->suolue(100);
$img->im = $m;
$img->suolue(300);
$img->merge($m,array('left'=>0,'top'=>0,'touming'=>60));
$img->merge($im,array('right'=>0,'bottom'=>0,'touming'=>60)); $img->write("春天来了",'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80));
$img->write("春天来了",'angle'=>45,'touming'=>80));
$img->display("gif");

原文链接:https://www.f2er.com/php/29215.html

猜你在找的PHP相关文章