• GD库


    GD库,是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。博主今天分享一篇关于GD库的文章,看完本篇文章,可以学到关于GD库的基本操作、相关案例,希望可以帮助到大家!


    开启GD库
    因为GD库是php的一个扩展库,可能有的同学没有开启,需要在php.ini 配置文件中进行开启,只需要在文件中查找下面这行,把前面的;去掉,就可以使用此扩展库的功能了,更改之后,注意还需要重启apache服务。

    ;extension=php_gd2.dll

    GD库的简单使用
    使用GD库,实际上和使用Windows中的画图软件是一样的,都具有一下这几个步骤。

    • 主要步骤

      1、创建一个空的画布
      2、创建画笔颜色
      3、画出图形
      4、输出图形到浏览器/生成文件
      5、销毁画布,释放内存

    • 参考代码

    <?php
    /**
     - GD2的使用
     - @author webbc
     */
    //1、创建一个空的画布
    $canvas = imagecreatetruecolor(200, 300);
    //给背景填充白色
    $green = imagecolorallocate($canvas, 255, 255, 255);
    imagefill($canvas, 0, 0, $green);
    //2、创建画笔颜色
    $red = imagecolorallocate($canvas, 255, 0, 0);
    imagestring($canvas, 4, 100, 150, 'hello world!', $red);//写一个字符串
    //3、画出图形
    imageellipse($canvas, 100, 150, 180, 280, $red);
    //4、保存图形到文件
    imagepng($canvas,'./pic.png');
    //5、销毁画布
    imagedestroy($canvas);
    ?>
    • 运行结果
      执行此程序,会在当前目录下生成一个名为pic.png的图片。

    这里写图片描述


    使用已有的图片作为画布
    在开发中,我们可能需要对图片进行某些修饰,我们可以将已有的图片作为画布,然后在上面进行绘画。

    • 原图
      这里写图片描述
    • 代码
    <?php
    /**
     - 利用现有的图片作为画布
     - @author webbc
     */
    $canvas = imagecreatefromjpeg('./12.jpg');//从当前目录下,将12.jpg文件作为画布
    $red = imagecolorallocate($canvas, 255, 0, 0);//创建画笔
    imagestring($canvas, 5, 0, 0, 'Jeremy Lin', $red);//写一个字符串
    imagepng($canvas,'./pic12.png');//保存图片
    ?>
    • 运行结果
      这里写图片描述

    在上面代码中,imagecreatefromjpeg($file)方法是将文件以jpeg形式打开,生成画布。像这样的方法还有很多,比如imagecreatefrompngimagecreatefromgif


    验证码的制作
    验证码也可以使用GD库进行操作,下面将实现一个简单的验证码功能。

    • 运行结果
      这里写图片描述

    • 参考代码

    <?php
    /**
     * 验证码的制作
     * @author webbc
     */
    
    /**
     * 随机字符串函数
     * @param int $num 指定所要的随机字符串长度
     * @return str 随机字符串
     */
    function randStr($num=6){
        $str = str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789');
        return substr($str,0,$num);
    }
    
    //创建画布
    $canvas = imagecreatetruecolor(50, 30);
    //创建颜色
    $red = imagecolorallocate($canvas, 255, 0, 0);
    $blue = imagecolorallocate($canvas,0,0,255);
    $gray = imagecolorallocate($canvas,127,127,127);
    //填充颜色
    imagefill($canvas, 0, 0, $red);
    //画随机字符串
    imagestring($canvas,5,5,5,randStr(4),$blue);
    //输出图片到浏览器上
    header("Content-type:image/png");
    imagepng($canvas);
    ?>

    上面的代码,首先定义了一个方法,用于生产随机的验证码,然后就是创建画布,创建了3个颜色,给画布填充了红色,然后用蓝色画出验证码,最后输出到浏览器上。


    添加水印
    在实际的项目中,我们可能会想微博那样需要对图片添加水印,这样可以对版权进行一定的保护。下面这个例子,主要是在图片的右下角添加一个矩形的水印效果。

    • 运行效果图
      这里写图片描述

    • 参考代码

    <?php
    /**
     * 给图片加水印
     * @author webbc
     */
    $big = imagecreatefromjpeg('./12.jpg');
    $small = imagecreatetruecolor(50,50);
    $blue = imagecolorallocate($small,0,0,255);
    $white = imagecolorallocate($small, 255, 255, 255);
    imagerectangle($small, 0, 0, 48,48, $blue);
    imagefill($small,2,2,$white);
    imagestring($small,5,12,15,"php",$blue);
    //获取大图和小图的宽高
    $bw = imagesx($big);
    $bh = imagesy($big);
    $sw = imagesx($small);
    $sh = imagesy($small);
    //将大图和小图进行合并
    imagecopymerge($big, $small, $bw-$sw, $bh-$sh, 0, 0, $sw, $sw, 50);
    //保存成文件
    imagepng($big,'./t1.png');
    imagedestroy($big);
    imagedestroy($small);
    ?>

    上面代码首先是以一个图片文件作为大的画布,然后新建一个小(50*50)的画布,然后以白色和蓝色在小的画布上画出两个矩形,写下一个文字,随后就是计算大图和小图的宽度,然后将小图和大图进行合并,之后形成文件。


    生成缩略图
    在项目开发中,经常会对图片进行裁剪,生成缩略图,不浪费用户的流量。下面这个案例主要是将文件进行折半 裁剪

    <?php
    /**
     * 生成缩略图
     * @author webbc
     */
    $big = imagecreatefromjpeg('./12.jpg');//创建大的画布
    list($bw,$bh) = getimagesize('./12.jpg');//计算图片的大小
    $small = imagecreatetruecolor($bw/2,$bh/2);//以原图宽高的一半创建小的画布
    imagecopyresized($small, $big, 0, 0, 0, 0, $bw/2, $bh/2, $bw, $bh);//将大的画布中的图形拷贝到小的画布上
    imagepng($small,'./t2.png');
    imagedestroy($big);
    imagedestroy($small);
    ?>

    以上代码显示以原图创建大的画布,计算原图的大小,并按原图的一般创建小的画布,然后将大的画布中的图形拷贝到小的画布上,最后生成文件。


    项目中的生成缩略图

    • 封装函数
      以下代码主要封装了两个函数,一个是获取指定文件的扩展名,还有一个是生成缩略图。将原图的名加上_thumb后缀形成缩略图的文件名,以原图创建大的画布,以指定大小创建小的画布,给小的画布填充白色,计算缩放比例,那边的缩放比例小,就采用哪个缩放比例,以缩放比例计算出在缩略图画布中最终成像的宽和高,将图像画到缩略图画布中,最后保存文件,销毁画布。
    <?php
    /**
     * 获取指定文件的扩展名,包括.
     * @param str $file 文件名
     * @return str 文件扩张名
     */
    function getExt($file){
        return strchr($file,'.');
    }
    
    /**
     * 生成缩略图
     * @param str $sourcePath 原图的路径
     * @param int $thumbWidth 缩略图的宽度
     * @param int $thumbHeight 缩略图的高度
     * @return str thumbPath 缩略图的路径
     */
    function createThumb($sourcePath,$thumbWidth=200,$thumbHeight=200){
        //拼接缩略图的文件名
        $ext = getExt($sourcePath);
        $filename = basename($sourcePath,$ext).'_thumb'.$ext;
        $thumbPath = dirname($sourcePath).'/'.$filename;
        //生成绝对路径
        $sourceAbsPath = ROOT.$sourcePath;
        $thumbAbsPath = ROOT.$thumbPath;
        //以原图创建画布
        list($sourceWidth,$sourceHeight,$imgType) = getimagesize($sourceAbsPath);
        $typeArr = array(
            1 => 'gif',
            2 => 'jpeg',
            3 => 'png',
            15 => 'wbmp'
        );
        if(!in_array($imgType, array_keys($typeArr))){
            return false;
        }
        $method = "imagecreatefrom".$typeArr[$imgType];
        $sCanvas = $method($sourceAbsPath);
        //创建缩略图画布
        $tCanvas = imagecreatetruecolor($thumbWidth, $thumbHeight);
        $white = imagecolorallocate($tCanvas, 255, 255, 255);//白色画笔
        imagefill($tCanvas, 0, 0, $white);//为画布填充为白色
        //计算缩放比例(以缩放比例小的为准)
        $rate = min($thumbWidth/$sourceWidth,$thumbHeight/$sourceHeight);
        //把原图按缩放比例计算,得到缩放图像宽高
        $zWidth = $sourceWidth * $rate;
        $zHeight = $sourceHeight * $rate;
        //把缩放图像画到缩略图画布上
        imagecopyresampled($tCanvas, $sCanvas, ($thumbWidth-$zWidth)/2, ($thumbHeight-$zHeight)/2,
         0, 0, $zWidth, $zHeight, $sourceWidth, $sourceHeight);
        //保存缩略图到文件
        $method = "image".$typeArr[$imgType];
        $method($tCanvas,$thumbAbsPath);
        //销毁画布
        imagedestroy($sCanvas);
        imagedestroy($tCanvas);
        return $thumbPath;
    }
    ?>

    使用函数
    以下代码显示检测了是否有文件在上传,然后保存原图,利用原图的路径生成缩略图

    //上传文件
    if($_FILES['pic']['name'] !== '' && $_FILES['pic']['error'] == 0){//判断是否在上传
        $file = createDir().'/'.randStr().getExt($_FILES['pic']['name']);//生成文件名
        move_uploaded_file($_FILES['pic']['tmp_name'] , ROOT.$file);
        $thumbPath = createThumb($file);
        //...可将原图路径和缩略图路径保存到数据库中
    }
  • 相关阅读:
    点双连通分量
    CF 839 E-最大团
    线性基
    CF 859 E
    【bzoj1303】[CQOI2009]中位数图
    【bzoj2282】[Sdoi2011]消防
    【bzoj2654]】tree
    【bzoj2600】 [Ioi2011]ricehub
    【bzoj4027】 [HEOI2015]兔子与樱花
    【bzoj3670】 [Noi2014]动物园
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407086.html
Copyright © 2020-2023  润新知