// 创建一个 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() ,以是我们要对画布进行背景色的添补。

php的gd库一路进修PHP中GD库的应用二 NoSQL

// 添补背景色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 的便是形状线段。
比如如果要一个矩形框的话,我们可以利用 imagerectangle() 来进行绘制。
同理,如果要画一个扇形块的话,我们也可以直策应用 imagefillarc() 。
更多的图形和线段大家可以参考文档,内容比较多,这里就不多罗列了,本日我们紧张的功能是天生一张验证码,只要有一个线段来做为滋扰成分就可以啦。

写字

直接在图片中写字也很大略。

$string = "I Like PHP!";// 水平写一个字符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, $red);

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(range(0, 9), range('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; if ($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);

代码就不多做阐明了,随机取一些字符,并且随机天生一些线段,其它的便是我们上面文章中先容过的函数的利用了。
末了天生的图片便是这个样子的:

总结

不管之前有没有自己写过这种验证码的小工具,本日的内容相信都是一次系统的学习和回顾,由于我们是按着顺序从创建一张图片画布,到绘制线条和图形,再到添加笔墨,末了天生图片这一系列的步骤走下来的。
往后不管是口试还是自己做小工具的时候,记住这条线,然后参考文档就可以啦。
毕竟这些函数的参数都还是挺长挺乱的,除非每天用,要不可真记不住。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/2.一起学习PHP中GD库的利用(二).php

参考文档:

https://www.php.net/manual/zh/book.image.php