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


Posted in PHP onMay 21, 2009
<?php /* 
*@author    夜无眠    27262681@qq.com 
*copyright    http://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, 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,0,0,$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,$height*4); 
        $tm = hexdec('7fffffff'); 
        imagettftext($im,$size,$angle,$width*2,$height*2,$color,$font,$str); 
        for($i=0;$i<$width*4;$i++) { 
            for($ii=0;$ii<$height*4;$ii++) { 
                if(imagecolorat($im,$i,$ii) != $tm) { 
                    $x_l = $i; 
                    break(2); 
                } 
            } 
        } 
        for($i=0;$i<$height*4;$i++) { 
            for($ii=$x_l;$ii<$width*4;$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<$height*4;$ii++) { 
                if(imagecolorat($im,$i,$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,$ii,$i) != $tm) { 
                    $y_b = $i; 
                    break(2); 
                } 
            } 
        } 
        $x_off = $x_l - $width*2; 
        $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,$size,$angle,$x,$y,$color,$font,$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,$x,$y,0,0,$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 = "<pre>\n<span style="color:red" style="color:red">错误:</span>\n".print_r($err->getTrace(),1)."\n</pre>"; 
    if($debug == true) { 
        file_put_contents(date('Y-m-d').".log",$str); 
        return $str; 
    }else{ 
        die($str); 
    } 
} 
*/ 
?>

这是简单的用法实例
$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,'top'=>0,'touming'=>60)); 
$img->merge($im,array('left'=>0,'bottom'=>0,'touming'=>60)); 
$img->merge($im,array('right'=>0,'bottom'=>0,'touming'=>60)); $img->write("春天来了",array('left'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80)); 
$img->write("春天来了",array('left'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80)); 
$img->write("春天来了",array('right'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80)); 
$img->write("春天来了",array('right'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80)); 
$img->display("gif");
PHP 相关文章推荐
PHP 文章中的远程图片采集到本地的代码
Jul 30 PHP
PHP 压缩文件夹的类代码
Nov 05 PHP
PHP 批量更新网页内容实现代码
Jan 05 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
详解PHP中的Traits
Jul 29 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
php实时倒计时功能实现方法详解
Feb 27 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
Aug 04 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 PHP
简单的php 验证图片生成函数
May 21 #PHP
PHP 数组入门教程小结
May 20 #PHP
php 无限级 SelectTree 类
May 19 #PHP
PHP日期时间函数的高级应用技巧
May 16 #PHP
PHP 模拟登陆MSN并获得用户信息
May 16 #PHP
抓取YAHOO股票报价的类
May 15 #PHP
PHP 采集心得技巧
May 15 #PHP
You might like
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
Views rows style模板重写代码
2011/05/16 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
python实现汉诺塔算法
2021/03/01 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
浅谈Python协程
2020/06/17 Python
python怎么对数字进行过滤
2020/07/05 Python
Python中Selenium模块的使用详解
2020/10/09 Python
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
给导游的表扬信
2014/01/10 职场文书
企业军训感想
2014/02/07 职场文书
奠基仪式主持词
2014/03/20 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书