首页 > 作文

GD库的基本信息,图像的旋转、水印、缩略图、验证码,以及图像类的封装

更新时间:2023-04-08 03:06:13 阅读: 评论:0

gd库检测

<?phpphpinfo();?>

gd库安装
• windows 使用phpstudy

• linux 编译安装 –with-gd
• linux 编译安装扩展

gd库支持的图像格式

使用 gd_info() 函数 检测服务器支持的图像格式

图像信息处理

<?php//获取图像详细信息$image = '../image/b.png';$info = getimagesize($image);var_dump($info);$string = file_get_contents($image);$info = getimagesizefromstring($string);var_dump($info);//获取图像的文件后缀$imagetype = image_type_to_extension($info[2],fal);var_dump($imagetype);//string(3) "png"//获取图像的mime type$mime = image_type_to_mime_type($info[2]);var_dump($mime);//string(9) "image/png"//创建图像$im = imagecreatefrompng($image);echo sprintf('a.jpg 宽:%s,高:%s',imagesx($im),imagesy($im));//a.jpg 宽:543,高:299//根据不同的图像type 来创建图像switch($info[2]){    ca 1://imagetype_gif        $im = imagecreatefromgif($image);        break;    ca imagetype_jpeg:        $im = imagecreatefromjpeg($image);        break;    ca 3:        $im = imagecreatefrompng($image);        break;    default:        echo '图像格式不支持';        break;}

随机显示图片

/** * 创建图像 * 设置背景色 * 输出图像 * *///创建图像 imagecreate();$im = imagecreatetruecolor(200,200);$back = imagecolorallocate($im,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));imagefill($im,0,0,$back);//设置header mime typeheader('content-type:image/png');imagepng($im,'../image/back.png');//随机输出图像到浏览器中$imagelist = array(    '../image/a.jpg',    '../image/b.png',    '../image/back.png');$imagekey = array_rand($imagelist);$image = $imagelist[$imagekey];//获取图像信息$info = getimagesize($image);//根据图像类别不同 调用不同的创建图像函数switch($info[2]){    ca 1://imagetype_gif        $im = imagecreatefromgif($image);        break;    ca imagetype_jpeg:        $im = imagecreatefromjpeg($image);        break;    ca 3:        $im = imagecreatefrompng($image);        break;    default:        echo '图像格式不支持';        break;}//设置header mime type$mimetype = image_type_to_mime_type($info[2]);header('content-type:'.$mimetype);//根据image type调用不同的图像输出类型switch($info[2]){    ca 1://imagetype_gif        imagegif($im);        break;    ca imagetype_jpeg:        imagejpeg($im,null,60);        break;    ca 3:        imagepng($im);        break;}imagedestroy($im);

图像旋转

//旋转图像$im = imagecreatefrompng('../image/b.png');$back = imagecolorallocate($im,233,230,232);$rotate = imagerotate($im,75,$back);header('content-type:image/jpeg');imagejpeg($rotate);

缩略图(图片放大缩小)

<?php/** * 缩略图 * *///创建原图$srcim = imagecreatefromjpeg('../image/a.jpg');$srcw = imagesx($srcim);$srch = imagesy($srcim);$percent = 0.5;$desw = $srcw * $percent;$desh = $srch * $percent;//创建新图$desim = imagecreatetruecolor($desw, $desh);//拷贝图像并调整大小//imagecopyresized();//重采样拷贝图像并调整大小imagecopyresampled($desim, $srcim, 0, 0, 0, 0, $desw, $desh, $srcw, $srch);//生成图imagejpeg($desim, "../image/a_{$desw}_{$desh}.jpg", 75);//imagepng($desim,"../image/a_{$desw}_{$desh}.png");//生成的图像会自动出现在image文件夹中,不会出现在页面上

图像拷贝(生成水印)

$im = imagecreatefrompng('../image/b.png');$logo = imagecreatefrompng('../image/logo.png');//把logo图片从x y开始宽度为w 高度为h的部分图像拷贝到im图像的x y坐标上imagecopy($im,$logo,400,200,0,0,imagesx($logo),imagesy($logo));//透明度拷贝imagecopymerge($im,$logo,400,200,0,0,imagesx($logo),imagesy($logo),10);header('content-type:image/png');imagepng($im);

图像中显示文字

//创建画布$im = imagecreatetruecolor(400,200);$back = imagecolorallocate($im,mt_rand(200,250),mt_rand(200,250),mt_rand(200,250));imagefill($im,0,0,$back);//创建字体颜色$stringcolor = imagecolorallocate($im,mt_rand(50,150),mt_rand(50,150),mt_rand(50,150));//图像中水平写入字符串//imagestring只能使用系统字体imagestring($im,5,mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),'hello',$stringcolor);//垂直写入字符串//imagestringup($im,5,mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),'hello',$stringcolor);header('content-type:image/png');imagepng($im);

随机四位数验证码

//创建画布$im = imagecreatetruecolor(400,200);$back = imagecolorallocate($im,mt_rand(200,250),mt_rand(200,250),mt_rand(200,250));imagefill($im,0,0,$back);//生成随机字符串$string = 'abcdefg123456789abcdefghigk';$str='';for($i=0;$i<4;$i++){    $str.= $string[mt_rand(0,strlen($string)-1)];}//图像中写入字符串imagestring($im,5,mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),$str,$stringcolor);header('content-type:image/png');imagepng($im);
imagettftext()可以使用自定义字体,然鹅
使用“imagettftext()”函数时,字体路径要写带盘符的绝对路径,写相对路径就报错
比如改成:
d:\phpstudy_pro\www\phptest\gd\font\comicz.ttf
imagettftext($im,15,mt_rand(-10,10),mt_rand(20,imagesx($im)-50),mt_rand(10,imagesy($im)),$stringcolor,'./font/comicz.ttf',$str);

四色随机验证码

<?php//创建画布$im = imagecreatetruecolor(400,200);$back = imagecolorallocate($im,mt_rand(200,250),mt_rand(200,250),mt_rand(200,250));imagefill($im,0,0,$back);//生成随机字符串$string = 'abcdefg123456789abcdefghigk';for($i=0;$i<4;$i++){    $stringcolor = imagecolorallocate($im,mt_rand(50,150),mt_rand(50,150),mt_rand(50,150));    $str = $string[mt_rand(0,strlen($string)-1)];    //图像中写入字符串    imagettftext($im,15,mt_rand(-10,10),20+$i*15,100,$stringcolor,'d:\phpstudy_pro\www\phptest\gd\font\comicz.ttf',$str);}header('content-type:image/png');imagepng($im);

各种图形绘制

<?php/** * 图形绘制 * 绘画复杂图形 *///画布$im = imagecreatetruecolor(400, 200);$back = imagecolorallocate($im, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));imagefill($im, 0, 0, $back);//画点$black = imagecolorallocate($im,10,10,10);for($i=0;$i<150;$i++){    imagetpixel($im,关于笑的四字词语mt_rand(10,390),mt_rand(10,190),$black);}//画线$red = imagecolorallocate($im, 10, 0, 0);for($j = 0; $j < 3; $j++){    imageline($im, mt_rand(10, 400), mt_rand(10, 200), mt_rand(10, 400), mt_rand(10, 200), $red);}//设置线条粗细imagetthickness($im,5);imageline($im, mt_rand(10, 400), mt_rand(10, 200), mt_rand(10, 400), mt_rand(10, 200), $red);$style = array($red,$red,$red,$red,$red,$back,$back,$back,$back,$back);//设置划线的风格imagetstyle($im,$style);//设置划线的风格imageline($im,10,50,250,200,img_color_styled);//画矩形imagerectangle($im,50,50,150,150,$red);//画圆imageellip($im,200,100,100,100,$red);header('content-type:image/jpeg');imagejpeg($im, null, 70);

验证码类的封装

gd库检测文件 gdbasic.php

<?php/** * gdbasic.php * description gd基础类 */namespace test\lib;class gdbasic{    protected static $_check =fal;    //检查服务器环境中gd库    public static function check()    {        //当静态变量不为fal        if(static::$_check)        {            return true;        }        //检查gd库是否加载        if(!function_exists("gd_info"))        {            throw new \exception('gd is not exists');        }        //检查gd库版本        $version = '';        $info = gd_info();        if(preg_match("/\\d+\\.\\d+(?:\\.\\d+)?/", $info["gd version"], $matches))        {            $version = $matches[0];        }        //当gd库版本小于2.0.1        if(!version_compare($version,'2.0.1','>='))        {            throw new \exception("gd requires gd version '2.0.1' or greater, you have " . $version);        }        lf::$_check = true;        return lf::$_check;    }}

验证码类的文件captcha.php

<?php/** * captcha.php * description 验证码类 */namespace test\lib;require_once 'gdbasic.php';class captcha extends gdbasic{    //图像宽度    protected $_width = 60;    //图像高度    protected $_height = 25;    //随机串    protected $_code = 'abcdefghjklmnpqrstuvwxyz23456789abcdefghjklmnpqrstuvwxyz';    //字体文件    protected $_font_file = 'd:\phpstudy_pro\www\phptest\gd\font\comicz.ttf';    //图像    protected $_im;    //验证码    protected $_captcha;    public function __construct($width = null, $height = null)    {        lf::check();        $this->create($width, $height);    }    /**     * 创建图像     * @param $width     * @param $height     */    public function create($width, $height)    {        $this->_width = is_numeric($width) ? $width : $this->_width;        $this->_height = is_numeric($height) ? $height : $this->_height;        //创建图像        $im = imagecreatetruecolor($this->_width, $this->_height);        $back = imagecolorallocate($im, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));        //填充底色        imagefill($im, 0, 0, $back);        $this->_im = $im;    }    /**     * 混乱验证码     */    public function moll()    {        $back = imagecolorallocate($this->_im, 0, 0, 0);        //在图像中随机生成50个点        for($i = 0; $i < 50; $i++)        {            imagetpixel($this->_im, mt_rand(0, $this->_width), mt_rand(0, $this->_阴天的英语height), $back);        }        imageline($this->_im, mt_rand(0, $this->_width), mt_rand(0, $this->_height), mt_rand(0, $this->_width), mt_rand(0, $this->_height), $back);        imageline($this->_im, mt_rand(0, $this->_width), mt_rand(0, $this->_height), mt_rand(0, $this->_width), mt_rand(0, $this->_height), $back);    }    /**     * 生成验证码随机串     * @param int $length 验证码的个数     * @param int $fontsize 字符串的字体大小     * @return captcha     */    public function string($length = 4, $fontsize = 15)    {        $this->moll();        $code = $this->_code;        $captcha = '';        for($i = 0; $i < $length; $i++)        {            $string = $code[mt_rand(0, strlen($code) - 1)];            $strcolor = imagecolorallocate($this->_im, mt_rand(100, 150), mt_rand(100, 150), mt_rand(100, 150));            imagettftext($this->_im, $fontsize, mt_rand(-10, 10), mt_rand(3, 6) + $i * (($this->_width - 10) / $length), ($this->_height / 3) * 2, $strcolor, $this->_font_file, $string);            $captcha .= $string;        }        $this->_captcha = $captcha;        return $this;    }    /**     * 验证码存入ssion     */    public function tssion()    {        if(!ist($_ssion))        {            ssion_start();        }        $_ssion['captcha_code'] = $this->_captcha;    }    /**     * 逻辑运算符验证码     * @param int $fontsize 字体大小     * @return $this     */    public function logic($fontsize = 12)    {        $this->moll();        $codearray = array(1 => 1, 2, 3, 4, 5, 6, 7, 8, 9);        $operatorarray = array('+' => '+', '-' => '-', 'x' => '*');        list($first, $cond) = array_rand($codearray, 2);        $operator = array_rand($operatorarray);        $captcha = 0;        $string = '';        switch($operator)        {            ca '+':                $captcha = $first + $cond;                break;            ca巨蟹男喜欢一个人的表现 '-':                //当第一个数小于第二个数                if($first < $cond)                {                    list($first, $cond) = array($cond, $first);                }                $captcha = $first - $cond;                break;            ca 'x':                $captcha = $first * $cond;                break;        }        //设置验证码类变量        $this->_captcha = $captcha;        //要输出到图像中的字符串        $string = sprintf('%s%s%s=?', $first, $operator, $cond);        $strcolor = imagecolorallocate($this->_im, mt_rand(100, 150), mt_rand(100, 150), mt_rand(100, 150));        imagettftext($this->_im, $fontsize, 0, 5, ($this->_height / 3) * 2, $strcolor, $this->_font_file, $string);        return $this;    }    /**     * 输出验证码     */    public function show()    {        //生成ssion        $this->tssion();        header('content-type:image/jpeg');        imagejpeg($this->_im);        imagedestroy($this->_im);    }}

检测gd库演示

//检测gd库$info = gd_info();preg_match("/\\d+\\.\\d+(?:\\.\\d+)?/", $info["gd version"], $matches);var_dump($matches);//0 => string '2.1.0' (length=5)

6位随机数验证码演示

require_once './lib/captcha.php';$captcha = new \test\lib\captcha(80,30);$captcha->string(6,14)->show();//6位数随机验证码

逻辑计算验证码演示

require_once './lib/captcha.php';$captcha = new \test\lib\captcha(80,30);$captcha->logic(12)->show();

图片类封装image.php

<?php/** * image.php * author: f.x * date: 2017 * description 图像类 */namespace test\lib;require_once 'gdbasic.php';class image extends gdbasic{    protected $_width;    protected $_height;    protected $_im;    protected $_type;    protected $_mime;    protected $_real_path;        public function __construct($file)    {        //检查gd库        lf::check();        $imageinfo = $this->createimagebyfile($file);        $this->_width = $imageinfo['width'];        $this->_height = $imageinfo['height'];        $this->_im = $imageinfo['im'];        $this->_type = $imageinfo['type'];        $this->_real_path = $imageinfo['real_path'];        $this->_mime = $imageinfo['mime'];    }    /**     * 根据文件创建图像     * @param $file     * @return array     * @throws \exception     */    public function createimagebyfile($file)    {        //检查文件是否存在        if(!file_exists($file))        {            throw new \exception('file is not exits');        }        //获取图像信息        $imageinfo = getimagesize($file);        $realpath = realpath($file);        if(!$imageinfo)        {            throw new \exception('file is not image file');        }        switch($imageinfo[2])        {            ca imagetype_gif:                $im = imagecreatefromgif($file);                break;            ca imagetype_jpeg:                $im = imagecreatefromjpeg($file);                break;            ca imagetype_png:                $im = imagecreatefrompng($file);                break;            default:                throw  new \exception('image file must be png,jpeg,gif');        }        力臂和力矩的关系return array(            'width'     => $imageinfo[0],            'height'    => $imageinfo[1],            'type'      => $imageinfo[2],            'mime'      => $imageinfo['mime'],            'im'        => $im,            'real_path' => $realpath,        );    }    /**     * 缩略图     * @param  int $width 缩略图高度     * @param  int $height 缩略图宽度     * @return $this     * @throws \exception     */    public function resize($width, $height)    {        if(!is_numeric($width) || !is_numeric($height))        {            throw new \exception('image width or height must be number');        }        //根据传参的宽高获取最终图像的宽高        $srcw = $this->_width;        $srch = $this->_height;        if($width <= 0 || $height <= 0)        {            $desw = $srcw;//缩略图高度            $desh = $srch;//缩略图宽度        }        el        {            $srcp = $srcw / $srch;//宽高比            $desp = $width / $height;            if($width > $srcw)            {                if($height > $srch)                {                    $desw = $srcw;                    $desh = $srch;                }                el                {                    $desh = $height;                    $desw = round($desh * $srcp);                }            }            el            {                if($desp > $srcp)                {                    $desw = $width;                    $desh = round($desw / $srcp);                }                el                {                    $desh = $height;                    $desw = round($desh * $srcp);                }            }        }        //php版本小于5.5        if(version_compare(php_version, '5.5.0', '<'))        {            $desim = imagecreatetruecolor($desw, $desh);            if(imagecopyresampled($desim, $this->_im, 0, 0, 0, 0, $desw, $desh, $srcw, $srch))            {                imagedestroy($this->_im);                $this->_im = $desim;                $this->_width = imagesx($this->_im);                $this->_height = imagesy($this->_im);            }        }        el        {            if($desim = imagescale($this->_im, $desw, $desh))            {                $this->_im = $desim;                $this->_width = imagesx($this->_im);                $this->_height = imagesy($this->_im);            }        }        return $this;    }    /**     * 根据百分比生成缩略图     * @param int $percent 1-100     * @return image     * @throws \exception     */    public function resizebypercent($percent)    {        if(intval($percent) <= 0)        {            throw new \exception('percent must be gt 0');        }        $percent = intval($percent) > 100 ? 100 : intval($percent);        $percent = $percent / 100;        $desw = $this->_width * $percent;        $desh = $this->_height * $percent;        return $this->resize($desw, $desh);    }    /**     * 图像旋转     * @param $degree     * @return $this     */    public function rotate($degree)    {        $degree = 360 - intval($degree);        $back = imagecolorallocatealpha($this->_im,0,0,0,127);        $im = imagerotate($this->_im,$degree,$back,1);        imagesavealpha($im,true);        imagedestroy($this->_im);        $this->_im = $im;        $this->_width = imagesx($this->_im);        $this->_height = imagesy($this->_im);        return $this;    }    /**     * 生成水印     * @param file $water 水印图片     * @param int $pct   透明度     * @return $this     */    public function watermask($water ='',$pct = 60 )    {        //根据水印图像文件生成图像资源        $waterinfo = $this->createimagebyfile($water);        imagecopymerge();        //销毁$this->_im        $this->_im = $waterinfo['im'];        $this->_width = imagesx($this->_im);        $this->_height = imagesy($this->_im);        return $this;    }        /**     * 图片输出     * @return bool     */    public function show()    {        header('content-type:' . $this->_mime);        if($this->_type == 1)        {            imagegif($this->_im);            return true;        }        if($this->_type == 2)        {            imagejpeg($this->_im, null, 80);            return true;        }        if($this->_type == 3)        {            imagepng($this->_im);            return true;        }    }    /**     * 保存图像文件     * @param $file     * @param null $quality     * @return bool     * @throws \exception     */    public function save($file, $quality = null)    {        //获取保存目的文件的扩展名        $ext = 阿伏伽德罗常数公式pathinfo($file, pathinfo_extension);        $ext = strtolower($ext);        if(!$ext || !in_array($ext, array('jpg', 'jpeg', 'gif', 'png')))        {            throw new \exception('image save file must be jpg ,png,gif');        }        if($ext === 'gif')        {            imagegif($this->_im, $file);            return true;        }        if($ext === 'jpeg' || $ext === 'jpg')        {            if($quality > 0)            {                if($quality < 1)                {                    $quality = 1;                }                if($quality > 100)                {                    $quality = 100;                }                imagejpeg($this->_im, $file, $quality);            }            el            {                imagejpeg($this->_im, $file);            }            return true;        }        if($ext === 'png')        {            imagepng($this->_im, $file);            return true;        }    }}

指定尺寸缩放 演示

require_once './lib/image.php';$image = new \test\lib\image('../image/b.png');$image->resize(400,200)->save('../image/b_400_200.png');

按比例缩放+旋转 演示

require_once './lib/image.php';$image = new \test\lib\image('../image/b.png');$image->resizebypercent(50)->rotate(1800)->show();

本文发布于:2023-04-08 03:06:11,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/91bee3c4d95cf7db65f3fe16e7ecbe4e.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:GD库的基本信息,图像的旋转、水印、缩略图、验证码,以及图像类的封装.doc

本文 PDF 下载地址:GD库的基本信息,图像的旋转、水印、缩略图、验证码,以及图像类的封装.pdf

标签:图像   验证码   字符串   缩略图
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图