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 15 PHP
php生成EXCEL的东东
Oct 09 PHP
php的一些小问题
Jul 03 PHP
PHP代码优化的53个细节
Mar 03 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
深入理解PHP中的count函数
May 31 PHP
PHP中include()与require()的区别说明
Feb 14 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
php-app开发接口加密详解
Apr 18 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
PHP实现微信提现功能(微信商城)
Nov 21 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php 魔术方法使用说明
2009/10/20 PHP
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
PHP学习笔记之session
2018/05/06 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jQuery实现点击小图片淡入淡出显示大图片特效
2015/09/09 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
vue组件学习教程
2017/09/09 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
JS实现简单日历特效
2020/01/03 Javascript
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
numpy基础教程之np.linalg
2019/02/12 Python
python能否java成为主流语言吗
2020/06/22 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
python 递归相关知识总结
2021/03/03 Python
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
HR喜欢的自荐信格式
2013/10/08 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
幼儿教师师德师风演讲稿
2014/08/22 职场文书
春节慰问信范文
2015/02/15 职场文书
销售开票员岗位职责
2015/04/15 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
JavaScript 定时器详情
2021/11/11 Javascript
Java 死锁解决方案
2022/05/11 Java/Android