GD缩略图

 写文字水印,可选文字颜色、大小、宽度、字体、透明度、位置
图片水印,可以把另一张图片当水印写入
指定文件名保存
可以在浏览器显示(调试用的)

/********************************************************************************
*                        GD缩略图类
* 功能:按比例缩图,直接缩图,直接缩图时可选择截图范围,写文字/图片水印
* 作者:cwsky
* http://blog.me94me.com
* 2007-11-15 22:50:04
********************************************************************************/<
br />

class ImageZoom
{
    var $imageType = “” ;        //图片类型
    var $fontArray = array();    //字体列表
    var $markText = “” ;            //文字水印,文字
    var $markImage = “” ;        //图片水印,文件名
    var $markType = 0;            //0:无水印,1:文字水印,2:图片水印
    var $markAlpha = 100;            //水印透明度
    var $markTextColor = “#111111″ ;            //字体颜色,如果要设字体为黑色,不能用#000000
    var $markTextSize = 20;        //字体大小
    var $markTextWidth = 100;        //字体宽度
    var $markTextAlignment = 9;        //对齐方式
    var $zoomType = true ;        //缩放类型,true:按比例缩放 false:直接缩放
    var $zoomPos = true ;        //当zoomType=false时,true:从图中间缩放 false:从左上角缩放
    var $imageComment = “cwsky研究MagickWand测试,http://blog.me94me.com” ;        //用看图软件,查看图片信息时可以看到

    /**
     * 缩图
     * @access public
     * @param string $srcImage
     * @param string $desImage
     * @param int $objWidth
     * @param int $objHeight
     * @return bool            返回true or false
     */<
br />
    function zoom($srcImage, $desImage, $objWidth, $objHeight)
    {
        $b = $ this ->markSetCheck();
        if ($b !== true )
        {
            return $b;
        }

        $cutedImageRes = $this ->cutImage($srcImage, $objWidth, $objHeight);
        $endImageRes = $this ->writeMark($cutedImageRes);

        //$this->showImage($endImageRes);
        if ($this ->writeImage($endImageRes, $desImage))
        {
            return true ;
        }
        else
        {
            return false ;
        }
    }
   
    function writeImage($res, $file)
    {
        switch ($this ->imageType)
        {
            case 'image/jpeg' :
            {
                if (imagejpeg($res, $file))
                {
                    return true ;
                }
                else
                {
                    return false ;
                }
                break ;
            }
            case 'image/gif' :
            {
                if (imagegif($res, $file))
                {
                    return true ;
                }
                else
                {
                    return false ;
                }
                break ;
            }
            case 'image/png' :
            {
                if (imagepng($res, $file))
                {
                    return true ;
                }
                else
                {
                    return false ;
                }
                break ;
            }
        }
    }
   
    /**
     * 在浏览器里显示图片(调试用)
     * @access private
     * @param string $srcImage
     * @param string $desImage
     * @param int $objWidth
     * @param int $objHeight
     * @return bool            返回true or false
     */<
br />
    function showImage($res)
    {
        header('Content-Type: ' . $this ->imageType);
        switch ($this ->imageType)
        {
            case 'image/jpeg' :
            {
                imagejpeg($res);
                break ;
            }
            case 'image/gif' :
            {
                imagegif($res);
                break ;
            }
            case 'image/png' :
            {
                imagepng($res);
                break ;
            }
        }
        exit;
    }

    /**
     * 裁图
     * @access private
     * @param string $srcImage
     * @param int $objWidth
     * @param int $objHeight
     * @return res            返回图像资源
     */<
br />
    function cutImage($srcImage, $objWidth, $objHeight)
    {
        $imageInfo = getimagesize($srcImage);
        $srcImageWidth = $imageInfo[0];
        $srcImageHeight = $imageInfo[1];
        $this ->imageType = $imageInfo['mime' ];
        $srcIM = $this ->readImageFile($srcImage);

        if ($this ->zoomType)
        {//按比例缩放
            if ($objWidth < $objHeight)
            {
                $mu = $srcImageWidth / $objWidth;
                $objHeight = ceil($srcImageHeight / $mu);
            }
            else
            {
                $mu = $srcImageHeight / $objHeight;
                $objWidth = ceil($srcImageWidth / $mu);
            }
            $resd = imagecreatetruecolor($objWidth, $objHeight);
            imagecopyresized($resd, $srcIM, 0, 0, 0, 0, $objWidth, $objHeight, $srcImageWidth, $srcImageHeight);
        }
        else
        {
            if ($objWidth < $objHeight)
            {
                $mu = $srcImageHeight / $objHeight;
                $objWidthT = ceil($srcImageWidth / $mu);
                $objHeightT = $objHeight;
            }
            else
            {
                $mu = $srcImageWidth / $objWidth;
                $objWidthT = $objWidth;
                $objHeightT = ceil($srcImageHeight / $mu);
            }
            $res = imagecreatetruecolor($objWidthT, $objHeightT);
            imagecopyresized($res, $srcIM, 0, 0, 0, 0, $objWidthT, $objHeightT, $srcImageWidth, $srcImageHeight);
            $resd = imagecreatetruecolor($objWidth, $objHeight);
           
            if ($this ->zoomPos)
            {
                if ($objWidth < $objHeight)
                {
                    $t = ceil($objWidthT / 2) - ceil($objWidth / 2);
                    imagecopy($resd, $res, 0, 0, $t, 0, $objWidth, $objHeight);
                }
                else
                {
                    $t = ceil($objHeightT / 2) - ceil($objHeight / 2);
                    imagecopy($resd, $res, 0, 0, 0, $t, $objWidth, $objHeight);
                }
            }
            else
            {
                imagecopy($resd, $res, 0, 0, 0, 0, $objWidth, $objHeight);
            }
        }

        return $resd;
    }

    /**
     * 加入水印
     * @access private
     * @param obj $res
     * @return res            返回图像资源
     */<
br />
    function writeMark($res)
    {
        if ($this ->markType == 0)
        {
            return $res;
        }

        if ($this ->markType == 1)
        {
            //此段代码说明
            //首先建立一个和最终图大小一样的透明图,并把文字写入到透明图相应位置,然后再把透明图合并到最终图上。这样就可以实现透明度了
            //特别说明:因为GD要建立透明图时,是使用的imagecolortransparent函数实现,发现只能背景为黑色时,此函数才有效。
            $R = hexdec(substr($this ->markTextColor, 1, 2));
            $G = hexdec(substr($this ->markTextColor, 3, 2));
            $B = hexdec(substr($this ->markTextColor, 5));
            $textEn = iconv(“gb2312″ , “utf-8″ , $this ->markText);        //如果你传入的是非UTF8中文,这里要转换
            $curFont = $this ->fontArray[mt_rand(0, count($this ->fontArray) - 1)];
            $imageW = imagesx($res);
            $imageH = imagesy($res);
            $dst = imagecreatetruecolor($imageW, $imageH);
            $textColor = imagecolorallocate($dst, $R, $G, $B);
            $black = imagecolorallocate($dst, 0, 0, 0);
            imagecolortransparent($dst, $black);
            $temp = imagettfbbox ($this ->markTextSize, 0, $curFont, $textEn); //取得使用 TrueType 字体的文本的范围
            $markW = $temp[2] - $temp[6];
            $markH = $temp[3] - $temp[7];
            $pos = $this ->getMarkPos($res, $markW, $markH);
            imagettftext($dst, $this ->markTextSize, 0, $pos['x' ], $pos['y' ], $textColor, $curFont, $textEn);
            imagecopymerge($res, $dst, 0, 0, 0, 0, $imageW, $imageH, $this ->markAlpha);
        }

        if ($this ->markType == 2)
        {
            $markIM = $this ->readImageFile($this ->markImage);
            $markW = imagesx($markIM);
            $markH = imagesy($markIM);
            $imageW = imagesx($res);
            $imageH = imagesy($res);
            $pos = $this ->getMarkPos($res, $markW, $markH);
            imagecopymerge($res, $markIM, $pos['x' ], $pos['y' ], 0, 0, $imageW, $imageH, $this ->markAlpha);
        }

        return $res;
    }
   
    function getMarkPos($res, $markW, $markH)
    {
        $imageW = imagesx($res);
        $imageH = imagesy($res);
        switch ($this ->markTextAlignment)
        {
            case 1 : //1为顶端居左
                 $posX = 0 ;
                 $posY = 0 ;
                break ;
            case 2 : //2为顶端居中
                 $posX = ($imageW - $markW) / 2 ;
                 $posY = 0 ;
                break ;
            case 3 : //3为顶端居右
                 $posX = $imageW - $markW ;
                 $posY = 0 ;
                break ;
            case 4 : //4为中部居左
                 $posX = 0 ;
                 $posY = ($imageH - $markH) / 2 ;
                break ;
            case 5 : //5为中部居中
                 $posX = ($imageW - $markW) / 2 ;
                 $posY = ($imageH - $markH) / 2 ;
                break ;
            case 6 : //6为中部居右
                 $posX = $imageW - $markW ;
                 $posY = ($imageH - $markH) / 2 ;
                break ;
            case 7 : //7为底端居左
                 $posX = 0 ;
                 $posY = $imageH - $markH ;
                break ;
            case 8 : //8为底端居中
                 $posX = ($imageW - $markW) / 2 ;
                 $posY = $imageH - $markH ;
                break ;
            case 9 : //9为底端居右
                 $posX = $imageW - $markW ;
                 $posY = $imageH - $markH ;
                break ;
            default : //随机
                 $posX = rand (0, ($imageW - $markW));
                 $posY = rand (0, ($imageH - $markH));
                break ;
        }
       
        $pos = array();
        $pos['x' ] = $posX;
        $pos['y' ] = $posY;
       
        return $pos;
    }
   
    function readImageFile($file)
    {
        switch ($this ->imageType)
        {
            case 'image/jpeg' :
            {
                $res = imagecreatefromjpeg($file);
                break ;
            }
            case 'image/gif' :
            {
                $res = imagecreatefromgif($file);
                break ;
            }
            case 'image/png' :
            {
                $res = imagecreatefrompng($file);
                break ;
            }
        }

        return $res;
    }

    /**
     * 水印相关参数检查
     * @access private
     * @return             true或错误说明
     */<
br />
    function markSetCheck()
    {
        if ($this ->markType == 1)
        {
            if (empty($this ->markText))
            {
                return “水印文字未设置” ;
            }
            elseif (count($this ->fontArray) == 0)
            {
                return “未设置字体列表” ;
            }
            else
            {
                return true ;
            }
        }
        elseif ($this ->markType == 2)
        {
            if (empty($this ->markImage))
            {
                return “水印图片未设置” ;
            }
            elseif (!is_file($this ->markImage))
            {
                return “水印图片有问题” ;
            }
            else
            {
                return true ;
            }
        }
        else
        {
            return true ;
        }
    }

    /**
     * 增加字体,文字水印用
     * @access public
     * @param string $file    字体文件路径
     */<
br />
    function addFont($file)
    {
        array_push($this ->fontArray, $file);
    }

    /**
     * 设置缩图类型
     * @access public
     * @param bool $zt    缩放类型
     * @param bool $zp    裁图范围
     */<
br />
    function setZoom($zt, $zp)
    {
        $this ->zoomType = $zt;
        $this ->zoomPos = $zp;
    }

    /**
     * 设置水印参数
     * @access public
     * @param int $mt    写水印类型
     * @param string $m    文字或图片
     * @param float $ma    文字透明度
     */<
br />
    function setMark($mt, $m, $ma = 100)
    {
        $this ->markType = $mt;
        if ($ma >= 0 && $ma <= 100)
        {
            $this ->markAlpha = $ma;
        }
        else
        {
            $this ->markAlpha = 1;
        }

        if ($this ->markType == 1)
        {
            $this ->markText = $m;
        }
        elseif ($this ->markType == 2)
        {
            $this ->markImage = $m;
        }
        else
        {
            $this ->markType = 0;
            $this ->markText = “” ;
            $this ->markImage = “” ;
        }
    }

    /**
     * 设置水印文字相关
     * @access public
     * @param string $fc    字体颜色,必须以#号开始的颜色号
     * @param int $fz    字体大小
     * @param int $fw    字宽,好像没什么用
     * @param string $fa    默认右下角
     */<
br />
    function setFont($fc = “#111111″ , $fz = 10, $fw = 100)
    {
        $this ->markTextColor = $fc;
        $this ->markTextSize = $fz;
        $this ->markTextWidth = $fw;
    }
   
    /**
     * 设置对齐方式
     * @access public
     * @param string $fa    默认右下角
     */<
br />
    function setAlignment($fa = 9)
    {
        $this ->markTextAlignment = $fa;
    }
}

//类使用例子
/*
//文字水印
$iz = new ImageZoom();
$iz->setZoom(false, false);
$iz->addFont(”MSYH.TTF”);
$iz->addFont(”simsun.ttc”);
$iz->setMark(1, “http://blog.me94me.com”, 50);
$b = $iz->zoom(”1.jpg”, “4.jpg”, 700, 500);
*/<
br />

/*
//图片水印
$iz = new ImageZoom();
$iz->setZoom(false, false);
$iz->setMark(2, “2.jpg”, 60);
$b = $iz->zoom(”3.jpg”, “4.jpg”, 500, 800);
*/<
br />
?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值