生成验证码
程序员文章站
2022-05-13 16:18:35
...
浅谈如何生成验证码
使用的函数有
header('content-type:image/png')
// png的图片格式
resource imagecreatetruecolor ( int $width , int $height )
// 新建一个真彩色图像
返回一个图像标识符,代表了一幅大小为 width 和 height 的黑色图像。
返回值:成功后返回图象资源,失败后返回 FALSE 。
bool imagepng ( resource $image [, string $filename ] )
将 GD 图像流( image )以 PNG 格式输出到标准输出(通常为浏览器),或者如果用 filename 给出了文件名则将其输出到该文件。
//销毁图像
bool imagedestroy ( resource $image )
释放与 image 关联的内存
int imagecolorallocate ( resource $image , int $red , int $green , int $blue )
为一幅图像分配颜色
red , green 和 blue 分别是所需要的颜色的红,绿,蓝成分。这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF
bool imagefill ( resource $image , int $x , int $y , int $color )
image 图像的坐标 x , y (图像左上角为 0, 0)处用 color 颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)。
绘制图形
imagesetpixel() 在 image 图像中用 color 颜色在 x , y 坐标(图像左上角为 0,0)上画一个点。
array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
size :字体的尺寸。根据 GD 的版本,为像素尺寸(GD1)或点(磅)尺寸(GD2)。
angle :角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。
由 x , y 所表示的坐标定义了第一个字符的基本点(大概是字符的左下角)。
color :颜色索引
fontfile :是想要使用的 TrueType 字体的路径。
text :UTF-8 编码的文本字符串。
一般来说我们有六个步骤: 穿建画布,画噪点,画噪线,画文字,保存回话,输出画布,销毁画布
因为是一个图形所以使用
header('content-type:image/png');
并且使用一个字符串
去除了不易识别的l,i,o L ,I, O,
$str = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ0123456789";
再定义一个画布$width = 150 ; $height = 60 ; $img = imagecreatetruecolor($width,$height);
定义颜色$color = imagecolorallocate($img,0xcc,0xcc,0xcc);
填充画布
imagefill($img,0,0,$color);
花噪点,噪线,文字
for($i=0;$i<100;$i++){
$color = imagecolorallocate($img,rand(0,100),rand(0,100),rand(0,100));
$x = rand(0,$width);
$y = rand(0,$height);
imagesetpixel($img,$x,$y,$color);
}
for($i=0;$i<30;$i++){
$color = imagecolorallocate($img,rand(0,100),rand(0,100),rand(0,100));
$x1 = rand(0,$width);
$y1 = rand(0,$height);
$x2 = rand(0,$width);
$y2 = rand(0,$height);
imageline($img,$x1,$y1,$x2,$y2,$color);
}
$len = strlen($str);
$font = "simsunb.ttf";
$yzm = '';
for ($i=0;$i<4;$i++){
$color = imagecolorallocate($img,255,0,0);
$index = rand(0,$len-1);
$chr = substr($str,$index,1);
$yzm .= $chr;
$x = 10 + $i * 25;
$y = 50;
imagettftext($img,30,rand(-45,45),$x,$y,$color,$font,$chr);
}
保存会话
setcookie('yzm',$yzm);
输出画布
imagepng($img);
销毁画布
imagedestroy($img);