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形式打开,生成画布。像这样的方法还有很多,比如imagecreatefrompng
、imagecreatefromgif
等
验证码的制作
验证码也可以使用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);
//...可将原图路径和缩略图路径保存到数据库中
}