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);
    //...可将原图路径和缩略图路径保存到数据库中
}
原文地址:https://www.cnblogs.com/cnsec/p/13407086.html