在日常的开发过程中,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 的就是形态线段。比方如果要一个矩形框的话,咱们能够应用 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
各自媒体平台均可搜寻【硬核项目经理】