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 相关文章推荐
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
Snoopy类使用小例子
Apr 15 PHP
PHP 面向对象实现代码
Nov 11 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
php接口与接口引用的深入解析
Aug 09 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
php制作文本式留言板
Mar 18 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
Oct 16 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 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
生成sessionid和随机密码的例子
2006/10/09 PHP
PhpMyAdmin中无法导入sql文件的解决办法
2010/01/08 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
深入解析PHP内存管理之谁动了我的内存
2013/06/20 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
Javascript图像处理—虚拟边缘介绍及使用方法
2012/12/27 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
解决vue.js提交数组时出现数组下标的问题
2019/11/05 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
python中执行shell的两种方法总结
2017/01/10 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
Pycharm小白级简单使用教程
2020/01/08 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
社会实践活动总结报告
2014/04/29 职场文书
银行求职自荐书
2014/06/25 职场文书
加强作风建设工作总结
2014/10/23 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
小学教师求职信范文
2015/03/20 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS