Apr
28

PHP图像处理类     2009

 15:59    426    0   noel 程序 代码 源码 不指定 | |
PHP图像处理类
第一个比较简单,比较常用
<?php  
    class image {  
        // 当前图片  
        protected $img;  
        // 图像types 对应表  
        protected $types = array(  
                        1 => 'gif',  
                        2 => 'jpg',  
                        3 => 'png',  
                        6 => 'bmp'  
                    );  
          
        // image  
        public function __construct($img=''){  
                !$img && $this->param($img);  
        }  
          
        // Info  
        public function param($img){  
                $this->img = $img;  
                return $this;  
        }  
          
        // imageInfo  
        public function getImageInfo($img){  
                $info = @getimagesize($img);  
                if(isset($this->types[$info[2]])){  
                        $info['ext'] = $info['type'] = $this->types[$info[2]];  
                } else{  
                        $info['ext'] = $info['type'] = 'jpg';  
                }  
                $info['type'] == 'jpg' && $info['type'] = 'jpeg';  
                $info['size'] = @filesize($img);  
                return $info;  
        }  
          
        // thumb(新图地址, 宽, 高, 裁剪, 允许放大)  
        public function thumb($filename,$new_w=160,$new_h=120,$cut=0,$big=0){  
        // 获取原图信息      
        $info  = $this->getImageInfo($this->img);  
        if(!emptyempty($info[0])) {  
            $old_w  = $info[0];  
            $old_h  = $info[1];  
            $type   = $info['type'];  
            $ext    = $info['ext'];  
            unset($info);  
            // 如果原图比缩略图小 并且不允许放大  
            if($old_w < $new_h && $old_h < $new_w && !$big){  
                    return false;  
            }  
            // 裁剪图片  
            if($cut == 0){ // 等比列  
                    $scale = min($new_w/$old_w, $new_h/$old_h); // 计算缩放比例  
                    $width  = (int)($old_w*$scale); // 缩略图尺寸  
                    $height = (int)($old_h*$scale);  
                    $start_w = $start_h = 0;  
                    $end_w = $old_w;  
                    $end_h = $old_h;  
            } elseif($cut == 1){ // center center 裁剪  
                        $scale1 = round($new_w/$new_h,2);  
                        $scale2 = round($old_w/$old_h,2);  
                        if($scale1 > $scale2){  
                                $end_h = round($old_w/$scale1,2);  
                                $start_h = ($old_h-$end_h)/2;  
                                $start_w  = 0;  
                                $end_w    = $old_w;  
                        } else{  
                                $end_w  = round($old_h*$scale1,2);  
                                $start_w  = ($old_w-$end_w)/2;  
                                $start_h = 0;  
                                $end_h   = $old_h;  
                        }  
                        $width = $new_w;  
                    $height= $new_h;    
                } elseif($cut == 2){ // left top 裁剪              
                        $scale1 = round($new_w/$new_h,2);  
                    $scale2 = round($old_w/$old_h,2);  
                    if($scale1 > $scale2){  
                            $end_h = round($old_w/$scale1,2);  
                            $end_w = $old_w;  
                    } else{  
                            $end_w = round($old_h*$scale1,2);  
                            $end_h = $old_h;  
                    }  
                    $start_w = 0;  
                    $start_h = 0;  
                    $width = $new_w;  
                    $height= $new_h;    
                }  
            // 载入原图  
            $createFun  = 'ImageCreateFrom'.$type;  
            $oldimg     = $createFun($this->img);    
            // 创建缩略图  
            if($type!='gif' && function_exists('imagecreatetruecolor')){  
                $newimg = imagecreatetruecolor($width, $height);    
            } else{  
                $newimg = imagecreate($width, $height);    
            }  
            // 复制图片  
            if(function_exists("ImageCopyResampled")){  
                    ImageCopyResampled($newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w,$end_h);    
            } else{  
                ImageCopyResized($newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w,$end_h);  
            }    
  
            // 对jpeg图形设置隔行扫描  
            $type == 'jpeg' && imageinterlace($newimg,1);  
            // 生成图片  
            $imageFun = 'image'.$type;  
            !@$imageFun($newimg,$filename) && die('保存失败!检查目录是否存在并且可写?');  
            ImageDestroy($newimg);  
            ImageDestroy($oldimg);  
            return $filename;  
        }  
        return false;  
    }  
      
    // water(保存地址,水印图片,水印位置,透明度)  
        public function water($filename,$water,$pos=0,$pct=80){  
                // 加载水印图片  
                $info = $this->getImageInfo($water);  
                if(!emptyempty($info[0])){  
                        $water_w = $info[0];  
                        $water_h = $info[1];  
                        $type = $info['type'];  
                        $fun  = 'imagecreatefrom'.$type;  
                        $waterimg = $fun($water);  
                } else{  
                        return false;  
                }  
                // 加载背景图片  
                $info = $this->getImageInfo($this->img);  
                if(!emptyempty($info[0])){  
                        $old_w = $info[0];  
                        $old_h = $info[1];  
                        $type  = $info['type'];  
                        $fun   = 'imagecreatefrom'.$type;  
                        $oldimg = $fun($this->img);  
                } else{  
                        return false;  
                }  
                // 剪切水印  
                $water_w >$old_w && $water_w = $old_w;  
                $water_h >$old_h && $water_h = $old_h;  
                  
                // 水印位置                          
                switch($pos){  
                        case 0://随机    
                    $posX = rand(0,($old_w - $water_w));    
                    $posY = rand(0,($old_h - $water_h));    
                    break;    
                case 1://1为顶端居左    
                    $posX = 0;    
                    $posY = 0;    
                    break;    
                case 2://2为顶端居中    
                    $posX = ($old_w - $water_w) / 2;    
                    $posY = 0;    
                    break;    
                case 3://3为顶端居右    
                    $posX = $old_w - $water_w;    
                    $posY = 0;    
                    break;    
                case 4://4为中部居左    
                    $posX = 0;    
                    $posY = ($old_h - $water_h) / 2;    
                    break;    
                case 5://5为中部居中    
                    $posX = ($old_w - $water_w) / 2;    
                    $posY = ($old_h - $water_h) / 2;    
                    break;    
                case 6://6为中部居右    
                    $posX = $old_w - $water_w;    
                    $posY = ($old_h - $water_h) / 2;    
                    break;    
                case 7://7为底端居左    
                    $posX = 0;    
                    $posY = $old_h - $water_h;    
                    break;    
                case 8://8为底端居中    
                    $posX = ($old_w - $water_w) / 2;    
                    $posY = $old_h - $water_h;    
                    break;    
                case 9://9为底端居右    
                    $posX = $old_w - $water_w;    
                    $posY = $old_h - $water_h;    
                    break;    
                default: //随机    
                    $posX = rand(0,($old_w - $water_w));    
                    $posY = rand(0,($old_h - $water_h));    
                    break;      
                }  
            // 设定图像的混色模式    
                imagealphablending($oldimg, true);    
                // 添加水印  
                imagecopymerge($oldimg, $waterimg, $posX, $posY, 0, 0, $water_w,$water_h,$pct);  
                $fun = 'image'.$type;  
                !@$fun($oldimg, $filename) && die('保存失败!检查目录是否存在并且可写?');    
                  imagedestroy($oldimg);  
                  imagedestroy($waterimg);  
                  return $filename;          
        }  
}  
  
//img类使用示例:  
// 原始图片  
//$img1 = './image/test.jpg';  
// 水印后的图片  
//$img2 = './image/test_new.jpg';  
// 水印  
//$water = './image/water.gif';  
//$img = new image();  
// 等比缩放  
//$img->param($img1)->thumb('./image/test_0.jpg', 200,200,0);  
// center center 裁剪  
//$img->param($img1)->thumb('./image/test_1.jpg', 200,200,1);  
// top left 裁剪  
//$img->param($img1)->thumb('./image/test_2.jpg', 200,200,2);  
// 右下角添加水印  
//$img->param($img1)->water($img2,$water,9);  
  
?>  



第二个比较复杂
<?php  
/**  
*  基本图片处理,用于完成图片缩入,水印添加  
*  当水印图超过目标图片尺寸时,水印图能自动适应目标图片而缩小  
*  水印图可以设置跟背景的合并度  
*  
*  Copyright(c) 2005 by ustb99. All rights reserved  
*  
*  To contact the author write to {@link mailto:ustb80@163.com}  
*  
* @author 偶然  
* @version $Id: thumb.class.php,v 1.9 2006/09/30 09:31:56 zengjian Exp $  
* @package system  
*/  
    
/**  
* ThumbHandler  
* @access public  
*/  
    
/*  
使用方法:  
    自动裁切:  
    程序会按照图片的尺寸从中部裁切最大的正方形,并按目标尺寸进行缩略  
  
    $t->setSrcImg("img/test.jpg");  
    $t->setCutType(1);//这一句就OK了  
    $t->setDstImg("tmp/new_test.jpg");  
    $t->createImg(60,60);  
  
    手工裁切:  
    程序会按照指定的位置从源图上取图  
  
    $t->setSrcImg("img/test.jpg");  
    $t->setCutType(2);//指明为手工裁切  
    $t->setSrcCutPosition(100, 100);// 源图起点坐标  
    $t->setRectangleCut(300, 200);// 裁切尺寸  
    $t->setDstImg("tmp/new_test.jpg");  
    $t->createImg(300,200);  
*/  
class ThumbHandler  
{  
    var $dst_img;// 目标文件  
    var $h_src; // 图片资源句柄  
    var $h_dst;// 新图句柄  
    var $h_mask;// 水印句柄  
    var $img_create_quality = 100;// 图片生成质量  
    var $img_display_quality = 80;// 图片显示质量,默认为75  
    var $img_scale = 0;// 图片缩放比例  
    var $src_w = 0;// 原图宽度  
    var $src_h = 0;// 原图高度  
    var $dst_w = 0;// 新图总宽度  
    var $dst_h = 0;// 新图总高度  
    var $fill_w;// 填充图形宽  
    var $fill_h;// 填充图形高  
    var $copy_w;// 拷贝图形宽  
    var $copy_h;// 拷贝图形高  
    var $src_x = 0;// 原图绘制起始横坐标  
    var $src_y = 0;// 原图绘制起始纵坐标  
    var $start_x;// 新图绘制起始横坐标  
    var $start_y;// 新图绘制起始纵坐标  
    var $mask_word;// 水印文字  
    var $mask_img;// 水印图片  
    var $mask_pos_x = 0;// 水印横坐标  
    var $mask_pos_y = 0;// 水印纵坐标  
    var $mask_offset_x = 5;// 水印横向偏移  
    var $mask_offset_y = 5;// 水印纵向偏移  
    var $font_w;// 水印字体宽  
    var $font_h;// 水印字体高  
    var $mask_w;// 水印宽  
    var $mask_h;// 水印高  
    var $mask_font_color = "#ffffff";// 水印文字颜色  
    var $mask_font = 2;// 水印字体  
    var $font_size;// 尺寸  
    var $mask_position = 0;// 水印位置  
    var $mask_img_pct = 50;// 图片合并程度,值越大,合并程序越低  
    var $mask_txt_pct = 50;// 文字合并程度,值越小,合并程序越低  
    var $img_border_size = 0;// 图片边框尺寸  
    var $img_border_color;// 图片边框颜色  
    var $_flip_x=0;// 水平翻转次数  
    var $_flip_y=0;// 垂直翻转次数  
    
    var $cut_type=0;// 剪切类型  
    
    
    var $img_type;// 文件类型  
    
    // 文件类型定义,并指出了输出图片的函数  
    var $all_type = array(  
        "jpg"  => array("output"=>"imagejpeg"),  
        "gif"  => array("output"=>"imagegif"),  
        "png"  => array("output"=>"imagepng"),  
        "wbmp" => array("output"=>"image2wbmp"),  
        "jpeg" => array("output"=>"imagejpeg"));  
    
    /**  
     * 构造函数  
     */  
    function ThumbHandler()  
    {  
        $this->mask_font_color = "#ffffff";  
        $this->font = 2;  
        $this->font_size = 12;  
    }  
    
    /**  
     * 取得图片的宽  
     */  
    function getImgWidth($src)  
    {  
        return imagesx($src);  
    }  
    
    /**  
     * 取得图片的高  
     */  
    function getImgHeight($src)  
    {  
        return imagesy($src);  
    }  
    
    /**  
     * 设置图片生成路径  
     *  
     * @param    string    $src_img   图片生成路径  
     */  
    function setSrcImg($src_img, $img_type=null)  
    {  
        if(!file_exists($src_img))  
        {  
            die("图片不存在");  
        }  
          
        if(!emptyempty($img_type))  
        {  
            $this->img_type = $img_type;  
        }  
        else  
        {  
            $this->img_type = $this->_getImgType($src_img);  
        }  
          
        $this->_checkValid($this->img_type);  
    
        // file_get_contents函数要求php版本>4.3.0  
        $src = '';  
        if(function_exists("file_get_contents"))  
        {  
            $src = file_get_contents($src_img);  
        }  
        else  
        {  
            $handle = fopen ($src_img, "r");  
            while (!feof ($handle))  
            {  
                $src .= fgets($fd, 4096);  
            }  
            fclose ($handle);  
        }  
        if(emptyempty($src))  
        {  
            die("图片源为空");  
        }  
        $this->h_src = @ImageCreateFromString($src);  
        $this->src_w = $this->getImgWidth($this->h_src);  
        $this->src_h = $this->getImgHeight($this->h_src);  
    }  
    
    /**  
     * 设置图片生成路径  
     *  
     * @param    string    $dst_img   图片生成路径  
     */  
    function setDstImg($dst_img)  
    {  
        $arr  = explode('/',$dst_img);  
        $last = array_pop($arr);  
        $path = implode('/',$arr);  
        $this->_mkdirs($path);  
        $this->dst_img = $dst_img;  
    }  
    
    /**  
     * 设置图片的显示质量  
     *  
     * @param    string      $n    质量  
     */  
    function setImgDisplayQuality($n)  
    {  
        $this->img_display_quality = (int)$n;  
    }  
    
    /**  
     * 设置图片的生成质量  
     *  
     * @param    string      $n    质量  
     */  
    function setImgCreateQuality($n)  
    {  
        $this->img_create_quality = (int)$n;  
    }  
    
    /**  
     * 设置文字水印  
     *  
     * @param    string     $word    水印文字  
     * @param    integer    $font    水印字体  
     * @param    string     $color   水印字体颜色  
     */  
    function setMaskWord($word)  
    {  
        $this->mask_word .= $word;  
    }  
    
    /**  
     * 设置字体颜色  
     *  
     * @param    string     $color    字体颜色  
     */  
    function setMaskFontColor($color="#ffffff")  
    {  
        $this->mask_font_color = $color;  
    }  
    
    /**  
     * 设置水印字体  
     *  
     * @param    string|integer    $font    字体  
     */  
    function setMaskFont($font=2)  
    {  
        if(!is_numeric($font) && !file_exists($font))  
        {  
            die("字体文件不存在");  
        }  
        $this->font = $font;  
    }  
    
    /**  
     * 设置文字字体大小,仅对truetype字体有效  
     */  
    function setMaskFontSize($size = "12")  
    {  
        $this->font_size = $size;  
    }  
    
    /**  
     * 设置图片水印  
     *  
     * @param    string    $img     水印图片源  
     */  
    function setMaskImg($img)  
    {  
        $this->mask_img = $img;  
    }  
    
    /**  
     * 设置水印横向偏移  
     *  
     * @param    integer     $x    横向偏移量  
     */  
    function setMaskOffsetX($x)  
    {  
        $this->mask_offset_x = (int)$x;  
    }  
    
    /**  
     * 设置水印纵向偏移  
     *  
     * @param    integer     $y    纵向偏移量  
     */  
    function setMaskOffsetY($y)  
    {  
        $this->mask_offset_y = (int)$y;  
    }  
    
    /**  
     * 指定水印位置  
     *  
     * @param    integer     $position    位置,1:左上,2:左下,3:右上,0/4:右下  
     */  
    function setMaskPosition($position=0)  
    {  
        $this->mask_position = (int)$position;  
    }  
    
    /**  
     * 设置图片合并程度  
     *  
     * @param    integer     $n    合并程度  
     */  
    function setMaskImgPct($n)  
    {  
        $this->mask_img_pct = (int)$n;  
    }  
    
    /**  
     * 设置文字合并程度  
     *  
     * @param    integer     $n    合并程度  
     */  
    function setMaskTxtPct($n)  
    {  
        $this->mask_txt_pct = (int)$n;  
    }  
    
    /**  
     * 设置缩略图边框  
     *  
     * @param    (类型)     (参数名)    (描述)  
     */  
    function setDstImgBorder($size=1, $color="#000000")  
    {  
        $this->img_border_size  = (int)$size;  
        $this->img_border_color = $color;  
    }  
    
    /**  
     * 水平翻转  
     */  
    function flipH()  
    {  
        $this->_flip_x++;  
    }  
    
    /**  
     * 垂直翻转  
     */  
    function flipV()  
    {  
        $this->_flip_y++;  
    }  
    
    /**  
     * 设置剪切类型  
     *  
     * @param    (类型)     (参数名)    (描述)  
     */  
    function setCutType($type)  
    {  
        $this->cut_type = (int)$type;  
    }  
    
    /**  
     * 设置图片剪切  
     *  
     * @param    integer     $width    矩形剪切  
     */  
    function setRectangleCut($width, $height)  
    {  
        $this->fill_w = (int)$width;  
        $this->fill_h = (int)$height;  
    }  
    
    /**  
     * 设置源图剪切起始坐标点  
     *  
     * @param    (类型)     (参数名)    (描述)  
     */  
    function setSrcCutPosition($x, $y)  
    {  
        $this->src_x  = (int)$x;  
        $this->src_y  = (int)$y;  
    }  
    
    /**  
     * 创建图片,主函数  
     * @param    integer    $a     当缺少第二个参数时,此参数将用作百分比,  
     *                             否则作为宽度值  
     * @param    integer    $b     图片缩放后的高度  
     */  
    function createImg($a, $b=null)  
    {  
        $num = func_num_args();  
        if(1 == $num)  
        {  
            $r = (int)$a;  
            if($r < 1)  
            {  
                die("图片缩放比例不得小于1");  
            }  
            $this->img_scale = $r;  
            $this->_setNewImgSize($r);  
        }  
    
        if(2 == $num)  
        {  
            $w = (int)$a;  
            $h = (int)$b;  
            if(0 == $w)  
            {  
                die("目标宽度不能为0");  
            }  
            if(0 == $h)  
            {  
                die("目标高度不能为0");  
            }  
            $this->_setNewImgSize($w, $h);  
        }  
    
        if($this->_flip_x%2!=0)  
        {  
            $this->_flipH($this->h_src);  
        }  
    
        if($this->_flip_y%2!=0)  
        {  
            $this->_flipV($this->h_src);  
        }  
        $this->_createMask();  
        $this->_output();  
    
        // 释放  
        if(imagedestroy($this->h_src) && imagedestroy($this->h_dst))  
        {  
            Return true;  
        }  
        else  
        {  
            Return false;  
        }  
    }  
    
    /**  
     * 生成水印,调用了生成水印文字和水印图片两个方法  
     */  
    function _createMask()  
    {  
        if($this->mask_word)  
        {  
            // 获取字体信息  
            $this->_setFontInfo();  
    
            if($this->_isFull())  
            {  
                die("水印文字过大");  
            }  
            else  
            {  
                $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);  
                $white = ImageColorAllocate($this->h_dst,255,255,255);  
                imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色  
                $this->_drawBorder();  
                imagecopyresampled( $this->h_dst, $this->h_src,  
                                    $this->start_x, $this->start_y,  
                                    $this->src_x, $this->src_y,  
                                    $this->fill_w, $this->fill_h,  
                                    $this->copy_w, $this->copy_h);  
                $this->_createMaskWord($this->h_dst);  
            }  
        }  
    
        if($this->mask_img)  
        {  
            $this->_loadMaskImg();//加载时,取得宽高  
    
            if($this->_isFull())  
            {  
                // 将水印生成在原图上再拷  
                $this->_createMaskImg($this->h_src);  
                $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);  
                $white = ImageColorAllocate($this->h_dst,255,255,255);  
                imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色  
                $this->_drawBorder();  
                imagecopyresampled( $this->h_dst, $this->h_src,  
                                    $this->start_x, $this->start_y,  
                                    $this->src_x, $this->src_y,  
                                    $this->fill_w, $this->start_y,  
                                    $this->copy_w, $this->copy_h);  
            }  
            else  
            {  
                // 创建新图并拷贝  
                $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);  
                $white = ImageColorAllocate($this->h_dst,255,255,255);  
                imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色  
                $this->_drawBorder();  
                imagecopyresampled( $this->h_dst, $this->h_src,  
                                    $this->start_x, $this->start_y,  
                                    $this->src_x, $this->src_y,  
                                    $this->fill_w, $this->fill_h,  
                                    $this->copy_w, $this->copy_h);  
                $this->_createMaskImg($this->h_dst);  
            }  
        }  
    
        if(emptyempty($this->mask_word) && emptyempty($this->mask_img))  
        {  
            $this->h_dst = imagecreatetruecolor($this->dst_w, $this->dst_h);  
            $white = ImageColorAllocate($this->h_dst,255,255,255);  
            imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$white);// 填充背景色  
            $this->_drawBorder();  
    
            imagecopyresampled( $this->h_dst, $this->h_src,  
                        $this->start_x, $this->start_y,  
                        $this->src_x, $this->src_y,  
                        $this->fill_w, $this->fill_h,  
                        $this->copy_w, $this->copy_h);  
        }  
    }  
    
    /**  
     * 画边框  
     */  
    function _drawBorder()  
    {  
        if(!emptyempty($this->img_border_size))  
        {  
            $c = $this->_parseColor($this->img_border_color);  
            $color = ImageColorAllocate($this->h_src,$c[0], $c[1], $c[2]);  
            imagefilledrectangle($this->h_dst,0,0,$this->dst_w,$this->dst_h,$color);// 填充背景色  
        }  
    }  
    
    /**  
     * 生成水印文字  
     */  
    function _createMaskWord($src)  
    {  
        $this->_countMaskPos();  
        $this->_checkMaskValid();  
    
        $c = $this->_parseColor($this->mask_font_color);  
        $color = imagecolorallocatealpha($src, $c[0], $c[1], $c[2], $this->mask_txt_pct);  
    
        if(is_numeric($this->font))  
        {  
            imagestring($src,  
                        $this->font,  
                        $this->mask_pos_x, $this->mask_pos_y,  
                        $this->mask_word,  
                        $color);  
        }  
        else  
        {  
            imagettftext($src,  
                        $this->font_size, 0,  
                        $this->mask_pos_x, $this->mask_pos_y,  
                        $color,  
                        $this->font,  
                        $this->mask_word);  
        }  
    }  
    
    /**  
     * 生成水印图  
     */  
    function _createMaskImg($src)  
    {  
        $this->_countMaskPos();  
        $this->_checkMaskValid();  
        imagecopymerge($src,  
                        $this->h_mask,  
                        $this->mask_pos_x ,$this->mask_pos_y,  
                        0, 0,  
                        $this->mask_w, $this->mask_h,  
                        $this->mask_img_pct);  
    
        imagedestroy($this->h_mask);  
    }  
    
    /**  
     * 加载水印图  
     */  
    function _loadMaskImg()  
    {  
        $mask_type = $this->_getImgType($this->mask_img);  
        $this->_checkValid($mask_type);  
    
        // file_get_contents函数要求php版本>4.3.0  
        $src = '';  
        if(function_exists("file_get_contents"))  
        {  
            $src = file_get_contents($this->mask_img);  
        }  
        else  
        {  
            $handle = fopen ($this->mask_img, "r");  
            while (!feof ($handle))  
            {  
                $src .= fgets($fd, 4096);  
            }  
            fclose ($handle);  
        }  
        if(emptyempty($this->mask_img))  
        {  
            die("水印图片为空");  
        }  
        $this->h_mask = ImageCreateFromString($src);  
        $this->mask_w = $this->getImgWidth($this->h_mask);  
        $this->mask_h = $this->getImgHeight($this->h_mask);  
    }  
    
    /**  
     * 图片输出  
     */  
    function _output()  
    {  
        $img_type  = $this->img_type;  
        $func_name = $this->all_type[$img_type]['output'];  
        if(function_exists($func_name))  
        {  
            // 判断浏览器,若是IE就不发送头  
            if(isset($_SERVER['HTTP_USER_AGENT']))  
            {  
                $ua = strtoupper($_SERVER['HTTP_USER_AGENT']);  
                if(!preg_match('/^.*MSIE.*\)$/i',$ua))  
                {  
                    header("Content-type:$img_type");  
                }  
            }  
            $func_name($this->h_dst, $this->dst_img, $this->img_display_quality);  
        }  
        else  
        {  
            Return false;  
        }  
    }  
    
    /**  
     * 分析颜色  
     *  
     * @param    string     $color    十六进制颜色  
     */  
    function _parseColor($color)  
    {  
        $arr = array();  
        for($ii=1; $ii<strlen ($color); $ii++)  
        {  
            $arr[] = hexdec(substr($color,$ii,2));  
            $ii++;  
        }  
    
        Return $arr;  
    }  
    
    /**  
     * 计算出位置坐标  
     */  
    function _countMaskPos()  
    {  
        if($this->_isFull())  
        {  
            switch($this->mask_position)  
            {  
                case 1:  
                    // 左上  
                    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;  
                    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;  
                    break;  
    
                case 2:  
                    // 左下  
                    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;  
                    $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;  
                    break;  
    
                case 3:  
                    // 右上  
                    $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;  
                    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;  
                    break;  
    
                case 4:  
                    // 右下  
                    $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;  
                    $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;  
                    break;  
    
                default:  
                    // 默认将水印放到右下,偏移指定像素  
                    $this->mask_pos_x = $this->src_w - $this->mask_w - $this->mask_offset_x;  
                    $this->mask_pos_y = $this->src_h - $this->mask_h - $this->mask_offset_y;  
                    break;  
            }  
        }  
        else  
        {  
            switch($this->mask_position)  
            {  
                case 1:  
                    // 左上  
                    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;  
                    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;  
                    break;  
    
                case 2:  
                    // 左下  
                    $this->mask_pos_x = $this->mask_offset_x + $this->img_border_size;  
                    $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;  
                    break;  
    
                case 3:  
                    // 右上  
                    $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;  
                    $this->mask_pos_y = $this->mask_offset_y + $this->img_border_size;  
                    break;  
    
                case 4:  
                    // 右下  
                    $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;  
                    $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;  
                    break;  
    
                default:  
                    // 默认将水印放到右下,偏移指定像素  
                    $this->mask_pos_x = $this->dst_w - $this->mask_w - $this->mask_offset_x - $this->img_border_size;  
                    $this->mask_pos_y = $this->dst_h - $this->mask_h - $this->mask_offset_y - $this->img_border_size;  
                    break;  
            }  
        }  
    }  
    
    /**  
     * 设置字体信息  
     */  
    function _setFontInfo()  
    {  
        if(is_numeric($this->font))  
        {  
            $this->font_w  = imagefontwidth($this->font);  
            $this->font_h  = imagefontheight($this->font);  
    
            // 计算水印字体所占宽高  
            $word_length   = strlen($this->mask_word);  
            $this->mask_w  = $this->font_w*$word_length;  
            $this->mask_h  = $this->font_h;  
        }  
        else  
        {  
            $arr = imagettfbbox ($this->font_size,0, $this->font,$this->mask_word);  
            $this->mask_w  = abs($arr[0] - $arr[2]);  
            $this->mask_h  = abs($arr[7] - $arr[1]);  
        }  
    }  
    
    /**  
     * 设置新图尺寸  
     *  
     * @param    integer     $img_w   目标宽度  
     * @param    integer     $img_h   目标高度  
     */  
    function _setNewImgSize($img_w, $img_h=null)  
    {  
        $num = func_num_args();  
        if(1 == $num)  
        {  
            $this->img_scale = $img_w;// 宽度作为比例  
            $this->fill_w = round($this->src_w * $this->img_scale / 100) - $this->img_border_size*2;  
            $this->fill_h = round($this->src_h * $this->img_scale / 100) - $this->img_border_size*2;  
    
            // 源文件起始坐标  
            $this->src_x  = 0;  
            $this->src_y  = 0;  
            $this->copy_w = $this->src_w;  
            $this->copy_h = $this->src_h;  
    
            // 目标尺寸  
            $this->dst_w   = $this->fill_w + $this->img_border_size*2;  
            $this->dst_h   = $this->fill_h + $this->img_border_size*2;  
        }  
    
        if(2 == $num)  
        {  
            $fill_w   = (int)$img_w - $this->img_border_size*2;  
            $fill_h   = (int)$img_h - $this->img_border_size*2;  
            if($fill_w < 0 || $fill_h < 0)  
            {  
                die("图片边框过大,已超过了图片的宽度");  
            }  
            $rate_w = $this->src_w/$fill_w;  
            $rate_h = $this->src_h/$fill_h;  
    
            switch($this->cut_type)  
            {  
                case 0:  
                    // 如果原图大于缩略图,产生缩小,否则不缩小  
                    if($rate_w < 1 && $rate_h < 1)  
                    {  
                        $this->fill_w = (int)$this->src_w;  
                        $this->fill_h = (int)$this->src_h;  
                    }  
                    else  
                    {  
                        if($rate_w >= $rate_h)  
                        {  
                            $this->fill_w = (int)$fill_w;  
                            $this->fill_h = round($this->src_h/$rate_w);  
                        }  
                        else  
                        {  
                            $this->fill_w = round($this->src_w/$rate_h);  
                            $this->fill_h = (int)$fill_h;  
                        }  
                    }  
    
                    $this->src_x  = 0;  
                    $this->src_y  = 0;  
    
                    $this->copy_w = $this->src_w;  
                    $this->copy_h = $this->src_h;  
    
                    // 目标尺寸  
                    $this->dst_w   = $this->fill_w + $this->img_border_size*2;  
                    $this->dst_h   = $this->fill_h + $this->img_border_size*2;  
                    break;  
    
                // 自动裁切  
                case 1:  
                    // 如果图片是缩小剪切才进行操作  
                    if($rate_w >= 1 && $rate_h >=1)  
                    {  
                        if($this->src_w > $this->src_h)  
                        {  
                            $src_x = round($this->src_w-$this->src_h)/2;  
                            $this->setSrcCutPosition($src_x, 0);  
                            $this->setRectangleCut($fill_h, $fill_h);  
    
                            $this->copy_w = $this->src_h;  
                            $this->copy_h = $this->src_h;  
                              
                        }  
                        elseif($this->src_w < $this->src_h)  
                        {  
                            $src_y = round($this->src_h-$this->src_w)/2;  
                            $this->setSrcCutPosition(0, $src_y);  
                            $this->setRectangleCut($fill_w, $fill_h);  
    
                            $this->copy_w = $this->src_w;  
                            $this->copy_h = $this->src_w;  
                        }  
                        else  
                        {  
                            $this->setSrcCutPosition(0, 0);  
                            $this->copy_w = $this->src_w;  
                            $this->copy_h = $this->src_w;  
                            $this->setRectangleCut($fill_w, $fill_h);  
                        }  
                    }  
                    else  
                    {  
                        $this->setSrcCutPosition(0, 0);  
                        $this->setRectangleCut($this->src_w, $this->src_h);  
    
                        $this->copy_w = $this->src_w;  
                        $this->copy_h = $this->src_h;  
                    }  
    
                    // 目标尺寸  
                    $this->dst_w   = $this->fill_w + $this->img_border_size*2;  
                    $this->dst_h   = $this->fill_h + $this->img_border_size*2;  
                      
                    break;  
    
                // 手工裁切  
                case 2:  
                    $this->copy_w = $this->fill_w;  
                    $this->copy_h = $this->fill_h;  
    
                    // 目标尺寸  
                    $this->dst_w   = $this->fill_w + $this->img_border_size*2;  
                    $this->dst_h   = $this->fill_h + $this->img_border_size*2;                  
                      
                    break;  
                default:  
                    break;  
    
            }  
        }  
    
        // 目标文件起始坐标  
        $this->start_x = $this->img_border_size;  
        $this->start_y = $this->img_border_size;  
    }  
    
    /**  
     * 检查水印图是否大于生成后的图片宽高  
     */  
    function _isFull()  
    {  
        Return (   $this->mask_w + $this->mask_offset_x > $this->fill_w  
                || $this->mask_h + $this->mask_offset_y > $this->fill_h)  
                   ?true:false;  
    }  
    
    /**  
     * 检查水印图是否超过原图  
     */  
    function _checkMaskValid()  
    {  
        if(    $this->mask_w + $this->mask_offset_x > $this->src_w  
            || $this->mask_h + $this->mask_offset_y > $this->src_h)  
        {  
            die("水印图片尺寸大于原图,请缩小水印图");  
        }  
    }  
    
    /**  
     * 取得图片类型  
     *  
     * @param    string     $file_path    文件路径  
     */  
    function _getImgType($file_path)  
    {  
        $type_list = array("1"=>"gif","2"=>"jpg","3"=>"png","4"=>"swf","5" => "psd","6"=>"bmp","15"=>"wbmp");  
        if(file_exists($file_path))  
        {  
            $img_info = @getimagesize ($file_path);  
            if(isset($type_list[$img_info[2]]))  
            {  
                Return $type_list[$img_info[2]];  
            }  
        }  
        else  
        {  
            die("文件不存在,不能取得文件类型!");  
        }  
    }  
    
    /**  
     * 检查图片类型是否合法,调用了array_key_exists函数,此函数要求  
     * php版本大于4.1.0  
     *  
     * @param    string     $img_type    文件类型  
     */  
    function _checkValid($img_type)  
    {  
        if(!array_key_exists($img_type, $this->all_type))  
        {  
            Return false;  
        }  
    }  
    
    /**  
     * 按指定路径生成目录  
     *  
     * @param    string     $path    路径  
     */  
    function _mkdirs($path)  
    {  
        $adir = explode('/',$path);  
        $dirlist = '';  
        $rootdir = array_shift($adir);  
        if(($rootdir!='.'||$rootdir!='..')&&!file_exists($rootdir))  
        {  
            @mkdir($rootdir);  
        }  
        foreach($adir as $key=>$val)  
        {  
            if($val!='.'&&$val!='..')  
            {  
                $dirlist .= "/".$val;  
                $dirpath = $rootdir.$dirlist;  
                if(!file_exists($dirpath))  
                {  
                    @mkdir($dirpath);  
                    @chmod($dirpath,0777);  
                }  
            }  
        }  
    }  
    
    /**  
     * 垂直翻转  
     *  
     * @param    string     $src    图片源  
     */  
    function _flipV($src)  
    {  
        $src_x = $this->getImgWidth($src);  
        $src_y = $this->getImgHeight($src);  
    
        $new_im = imagecreatetruecolor($src_x, $src_y);  
        for ($y = 0; $y < $src_y; $y++)  
        {  
            imagecopy($new_im, $src, 0, $src_y - $y - 1, 0, $y, $src_x, 1);  
        }  
        $this->h_src = $new_im;  
    }  
    
    /**  
     * 水平翻转  
     *  
     * @param    string     $src    图片源  
     */  
    function _flipH($src)  
    {  
        $src_x = $this->getImgWidth($src);  
        $src_y = $this->getImgHeight($src);  
    
        $new_im = imagecreatetruecolor($src_x, $src_y);  
        for ($x = 0; $x < $src_x; $x++)  
        {  
            imagecopy($new_im, $src, $src_x - $x - 1, 0, $x, 0, 1, $src_y);  
        }  
        $this->h_src = $new_im;  
    }  
}  
使用实例:  
    
< ?php  
require_once('lib/thumb.class.php');  
    
$t = new ThumbHandler();  
    
$t->setSrcImg("img/test.jpg");  
$t->setDstImg("tmp/new_test.jpg");  
$t->setMaskImg("img/test.gif");  
$t->setMaskPosition(1);  
$t->setMaskImgPct(80);  
$t->setDstImgBorder(4,"#dddddd");  
    
// 指定缩放比例  
$t->createImg(300,200);  
?>  
<?php  
require_once('lib/thumb.class.php');  
    
$t = new ThumbHandler();  
    
// 基本使用  
$t->setSrcImg("img/test.jpg");  
$t->setMaskWord("test");  
$t->setDstImgBorder(10,"#dddddd");  
    
// 指定缩放比例  
$t->createImg(50);  
?>  
<?php  
equire_once('lib/thumb.class.php');  
    
$t = new ThumbHandler();  
    
// 基本使用  
$t->setSrcImg("img/test.jpg");  
$t->setMaskWord("test");  
    
// 指定固定宽高  
$t->createImg(200,200);  
?>  
<?php  
require_once('lib/thumb.class.php');  
    
$t = new ThumbHandler();  
    
$t->setSrcImg("img/test.jpg");  
$t->setDstImg("tmp/new_test.jpg");  
$t->setMaskWord("test");  
    
// 指定固定宽高  
$t->createImg(200,200);  
?>  
<?php  
require_once('lib/thumb.class.php');  
    
$t = new ThumbHandler();  
    
$t->setSrcImg("img/test.jpg");  
    
// 指定字体文件地址  
$t->setMaskFont("c:/winnt/fonts/arial.ttf");  
$t->setMaskFontSize(20);  
$t->setMaskFontColor("#ffff00");  
$t->setMaskWord("test3333333");  
$t->setDstImgBorder(99,"#dddddd");  
$t->createImg(50);  
    
?>  
<?php  
require_once('lib/thumb.class.php');  
    
$t = new ThumbHandler();  
    
$t->setSrcImg("img/test.jpg");  
$t->setMaskOffsetX(55);  
$t->setMaskOffsetY(55);  
$t->setMaskPosition(1);  
//$t->setMaskPosition(2);  
//$t->setMaskPosition(3);  
//$t->setMaskPosition(4);  
$t->setMaskFontColor("#ffff00");  
$t->setMaskWord("test");  
    
// 指定固定宽高  
$t->createImg(50);  
?>  
<?php  
require_once('lib/thumb.class.php');  
    
$t = new ThumbHandler();  
    
$t->setSrcImg("img/test.jpg");  
$t->setMaskFont("c:/winnt/fonts/simyou.ttf");  
$t->setMaskFontSize(20);  
$t->setMaskFontColor("#ffffff");  
$t->setMaskTxtPct(20);  
$t->setDstImgBorder(10,"#dddddd");  
$text = "中文";  
$str = mb_convert_encoding($text, "UTF-8", "gb2312");  
$t->setMaskWord($str);  
$t->setMaskWord("test");  
    
// 指定固定宽高  
$t->createImg(50);  
?>  

作者:noel@ECMall Ecmall二次开发 - PHP技术-
地址:http://www.laohucheng.com/post/356/
版权所有©转载时必须以链接形式注明作者和原始出处及本声明!

Tags: 引用(0)
发表评论
昵称 [注册]
密码 游客无需密码
网址
电邮
打开HTML 打开UBB 打开表情 隐藏 记住我