gd库是学习php比较早接触到的部分,因为学过一些canvas,所以感觉上手快,容易出效果,感觉验证码又有点小神秘,从最基础的做开始,熟悉一些函数,函数名真的长,但是很多都是见而知其意,后面还会封装成类和函数,包括完整的验证
GD2使用步骤
- 创建画布
- 创建颜色
- 开始绘制
- 格式输出
- 销毁资源
imagefontwidth()
<?php
$width = 300;
$height = 100;
$image =imagecreatetruecolor($width,$height); //创建画布,默认返回黑色背景
$white = imagecolorallocate($image,255,255,255);//画布背景色
imagefilledrectangle($image,0,0,$width,$height,$white); //填充画布背景色
for($i=0;$i<4;$i++){
$fontsize = mt_rand(30,40);
$fontcolor=imagecolorallocate($image,rand(0, 120),rand(0, 120),rand(0, 120));
//验证码颜色,放在循环里,每个字符颜色不同
$data = "abcdefghijklmnpqrstuvwyz123456789";
$fontcontent = substr($data,rand(0, strlen($data)-1), 1);
$x=($i*300/4)+rand(30, 50);
$y=rand(40, 70);
$angle = mt_rand(-15,15);
imagettftext($image,$fontsize,$angle,$x,$y,$fontcolor,'msyh.ttc',$fontcontent);
}
header("content-type:image/jpeg;charset=utf-8");
ob_clean(); //这个就很怪,有时候不加就报错
imagejpeg($image);
imagedestroy($image);
?>
关键点在于随机出现四个摆放不同的字符,还有另一种简易方式
$string = join("",array_merge(range('a','z'),range('A','Z'),range(0,9)));
$text = str_shuffle($string)[0];
str_shuffle( )用于随机打乱字符串,返回字符串,截取第一个字符
加上点和线的干扰元素
for ($i = 0;$i < 50;$i++){
imagesetpixel($image,mt_rand(0,$width),mt_rand(0,$height),randcolor($image));
}
for ($i = 0;$i < 3;$i++){
imageline($image,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),randcolor($image));
}
里面的randcolor($image)是封装的函数
function randcolor($image){
return imagecolorallocate($image,mt_rand(30,120),mt_rand(30,120),mt_rand(30,120));
};