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分页函数代码(简单实用型)
Dec 02 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
解析php做推送服务端实现ios消息推送
Jul 01 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
PHP独立Session数据库存储操作类分享
Jun 11 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
php实现删除空目录的方法
Mar 16 PHP
php实现的网络相册图片防盗链完美破解方法
Jul 01 PHP
php实现PDO中捕获SQL语句错误的方法
Feb 16 PHP
PHP chr()函数讲解
Feb 11 PHP
PHP生成指定范围内的N个不重复的随机数
Mar 18 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 register_shutdown_function函数的深入解析
2013/06/03 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JS之小练习代码
2008/10/12 Javascript
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
Javascript动画的实现原理浅析
2015/03/02 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
vue中利用Promise封装jsonp并调取数据
2019/06/18 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
jquery实现鼠标悬浮弹出气泡提示框
2020/12/23 jQuery
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
《Python之禅》中对于Python编程过程中的一些建议
2015/04/03 Python
Python3实现Web网页图片下载
2016/01/28 Python
深入理解python中的atexit模块
2017/03/07 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python制作图片缩略图
2019/04/30 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
计算机维护专业推荐信
2014/02/27 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
保安辞职信范文
2015/02/28 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
学校少先队工作总结
2015/08/12 职场文书
python实现腾讯滑块验证码识别
2021/04/27 Python
Android中View.post和Handler.post的关系
2022/06/05 Java/Android