在日常的开发过程中,GD库最常用的功能就是帮我们处理一些图片。当然除了对已有的图片进行处理外,它还可以直接绘制图片,就像我们最常见的图片验证码一样。今天的内容主要是画图相关,所以最后我们也会做一个非常简单的图片验证码的例子。创建图片并指定颜色首先,我们需要为图片创建一个画布。就像PhotoShop一样,任何绘图都必须在画布下完成。//创建一个200X200的图像$img=imagecreatetruecolor(200,200);//分配颜色$white=imagecolorallocate($img,255,255,255);$black=imagecolorallocate($img,0,0,0);$red=imagecolorallocate($img,255,0,0);//透明通道颜色$alphaRed=imagecolorclosestalpha($img,255,0,0,50);imagecreatetruecolor()函数用于创建一张真彩色图片,它与imagecreate()的区别在于imagecreate()是根据调色板创建图片。他们有不同的填充画布的过程。imagecreate()不需要使用imagefill()来填充背景颜色。直接使用imagecolorallocate()将使用第一次调用imagecolorallocate()时的颜色填充它。它们返回的图像文件句柄都是后面操作需要的句柄对象。imagecolorallocate()是给图像分配颜色。这里我们定义了几种颜色。此外,我们使用imagecolorclosestalpha()来定义一种颜色,其通道仍然是透明的。它的最后一个参数是0-100的透明度设置。填充背景色接下来,由于我们使用imagecreatetruecolor(),我们需要填充画布的背景色。//填充背景色imagefill($img,0,0,$black);圆弧、直线、矩形,不管是画直线还是画圆弧,都只是一些简单的函数调用。//画一个白色圆圈imagearc($img,100,100,150,150,0,360,$white);//画一条线段imageline($img,20,180,120,120,$white);//填充透明矩形imagefilledrectangle($img,30,30,70,70,$alphaRed);imagearc()函数本身就是用来画圆弧的,第二个和第三个参数用来指定圆心的位置,第四个和第五个参数指定圆的宽和高,第六个和第七个参数指定圆弧的起始位置(以角度指定),最后一个参数为指定的颜色。通过给定一个从0到360度的角度,我们画了一个圆。如果不是完整的360度数,它将是一个圆弧。直线段的函数imageline()参数比较简单。第二个和第三个参数是起点坐标,第四个和第五个参数是终点坐标。当连接两个坐标点时绘制线段。imagefilledrectangle()以填充的方式绘制矩形,也就是说,我们绘制的矩形内部填充的是颜色,而不是线条的描边。它的参数坐标和线段一样,我们用上面定义的透明颜色填充。当然还有很多图形和线条我们可以直接画出来。需要注意的是,有fill关键字的基本都是填充图形,没有fill的是shape线段。例如,如果我们想要一个矩形框,我们可以使用imagerectangle()来绘制它。同样,如果我们想绘制一个扇形块,也可以直接使用imagefillarc()。更多图形和线段可以参考文档。内容很多,这里就不一一列举了。我们今天的主要功能是生成验证码,只要有线段作为干扰因素即可。写直接在图上写也很简单。$string="ILikePHP!";//水平写一个字符imagechar($img,5,70,50,$string,$red);//垂直写一个字符imagecharup($img,3,120,50,$string,$red);//水平写入字符串imagestring($img,5,70,150,$string,$red);//垂直写入字符串imagestringup($img,3,120,150,$string,$红色);imagechar()是只写一个字符,imagecharup()是竖写。imagestring()是写字符串,imagestringup()是竖写字符串。它们的第二个参数是字体的大小,第三个和第四个参数是坐标开始书写的起始位置。但是如果用这些函数来写图片的内容,主要的问题是不能指定字体,以至于默认无法输出中文。因此,我们一般会使用另外一个函数来为图片添加文字。//以TrueType字体将文本写入图像$font='../font/arial.ttf';imagettftext($img,20,0,11,21,$white,$font,$string);imagettftext()函数可以通过指定的字体给图片添加文字内容。有了字体文件的支持,写出来的文字就好看多了。更重要的是,它还可以轻松调整文字大小和倾斜角度。第二个参数是指定文字的大小,第三个参数是指定文字的倾斜角度,也就是我们可以旋转文字。生成图片最后当然是要生成并输出图片了!//输出图像到浏览器header("Content-type:image/png");imagepng($img);//释放内存imagedestroy($img);我们的测试代码是将图片直接输出到浏览器,所以需要为文件输出指定一个header。使用imagepng()生成PNG格式的图片。它还有第二个参数。如果给定第二个参数,则图片将直接作为文件保存到参数指定的路径下。如果不给这个参数,会像phpinfo()一样直接输出到输出缓冲区,即直接打印内容。最后,我们使用imagedestroy()释放图像句柄,以消除图像文件的内存占用。除了imagepng(),还有imagejpeg()、imagegif()等一系列图像生成函数,大家可以参考文档自行学习。说了这么多,我们头顶的一堆东西到底画的是什么?小例子:简单的验证码图片最后一个小例子就是我们开头说的生成一个非常简单的图片验证码。现在的验证码功能其实很复杂。验证码的形式多种多样,主要是为了系统安全。同样,Composer中也有很多现成的验证码组件供我们使用。其实这样的验证码功能我们不需要自己去实现,但是对于学习来说,总是需要接触去了解,而如果是一些小的小项目,可以自己写一个来练习。$img=imagecreatetruecolor(120,50);imagefill($img,0,0,imagecolorallocate($img,255,255,255));$colors=[imagecolorallocate($img,0,0,0),imagecolorallocate($img,255,0,0),imagecolorallocate($img,0,255,0),imagecolorallocate($img,0,0,255),];$chars=array_merge(范围(0,9),范围('a','z'),range('A','Z'));for($i=0;$i<10;$i++){imageline($img,random_int(0,120),random_int(0,50),random_int(0,120),random_int(0,50),$colors[array_rand($colors)]);}$font='../font/arial.ttf';for($i=0;$i<4;$i++){$char=$chars[array_rand($chars)];$fontSize=random_int(18,24);$c=random_int(-20,20);$x=$i*26;如果($x==0){$x=5;}imagettftext($img,$fontSize,$c,$x,40,$colors[array_rand($colors)],$font,$char);}header("Content-type:image/png");imagepng($img);imagedestroy($img);代码就不多解释了,一些字符是随机选择的,一些线段是随机生成的,另外就是上面文章介绍的函数的使用。最终生成的图片是这样的:总结不管你以前有没有写过这种验证码小工具,今天的内容相信是系统的学习和复习,因为我们是按照从创建图片画布到画线的顺序和Graphics,然后添加文字,最后生成图片,这一系列的步骤往下走。以后不管是面试还是自己做个小工具,记住这行,然后再参考文档。毕竟这些函数的参数还是挺长的,比较乱,除非你天天用,否则真的记不住。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/2。一起学习PHP中GD库的使用(二).php参考文档:https://www.php.net/manual/zh/book.image.php各媒体平台均可搜索【硬核项目经理】
