绘制图形验证码效果如下图:
<img src="../check.php" onClick="this.src='../check.php?id='+Math.random()"/>
<?php
//绘制验证码
$num = 4; // 验证码的长度
$str = getCode($num,2); // 使用自定义的函数,获得验证码的信息
// 1. 创建一个画布,分配颜色
$width=$num*20; //设置画布的宽度
$height=30; //设置画布的高度
$im=imagecreatetruecolor($width,$height);
//定义几种颜色 (输出验证码显示不同的颜色)
$color[]=imagecolorallocate($im,101,0,35);
$color[]=imagecolorallocate($im,0,77,0);
$color[]=imagecolorallocate($im,0,0,160);
$color[]=imagecolorallocate($im,221,111,0);
$color[]=imagecolorallocate($im,220,0,0);
$bg=imagecolorallocate($im,240,240,240);
// 2. 开始绘图
imagefill($im,0,0,$bg);
imagerectangle($im,0,0,$width-1,$height-1,$color[rand(0,4)]);
// 添加干扰点
for($i=0;$i<200;$i++){
$c=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel($im,rand(0,$width),rand(0,$height),$c);
}
//添加干扰线
for($i=0;$i<5;$i++){
$c=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imageline($im,rand(0,$width),rand(0,$height),rand(0,$width),rand(0,$height),$c);
}
//绘制验证码的内容(一个一个的输出)
for($i=0;$i<$num;$i++){
imagettftext($im,20,rand(-40,40),8+($i*18),24,$color[rand(0,4)],"simfang.ttf",$str[$i]);
}
// 3. 输出图像
header("Content-type:image/png");//设置头文件响应(注意此实施前不能有输出)
imagepng($im);
// 4. 销毁图像 (释放内存)
imagedestroy($im);
/*
* 随机生成一个验证码的函数
* @param $m : 验证码的个数(默认是显示4个)
* @param $type : 验证码的类型 0:表示纯数字 1:数字加小写字母 2:数字加大小写字母
*
*/
function getCode($m=4,$type=0){
$str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
//echo strlen($str);
$t=array(9,35,strlen($str)-1);
$c="";
for($i=0;$i<$m;$i++){
$c.=$str[rand(0,$t[$type])];
}
return $c;
}
//echo getCode(6,1);
//
function _code($_code_length = 4, $_width = 75, $_height = 25){
for($i=0;$i<$_code_length;$i++){
$_nmsg .= dechex(mt_rand(0,15));
}
$_SESSION["code"] = $_nmsg;
$_img = imagecreatetruecolor($_width, $_height);
$_white = imagecolorallocate($_img, 250, 250, 250);
imagefill($_img, 0, 0, $_white);
$_gray = imagecolorallocate($_img, 196, 196, 196);
imagerectangle($_img, 0, 0, $_width-1, $_height-1, $_gray);
for ($i=0; $i < 6; $i++) {
$_md_color = imagecolorallocate($_img, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
imageline($_img, mt_rand(0,$_width), mt_rand(0, $_height),mt_rand(0,$_width), mt_rand(0, $_height), $_md_color);
}
for ($i=0; $i < 50; $i++) {
$_md_color = imagecolorallocate($_img, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
imagestring($_img, 1, mt_rand(1,$_width-5), mt_rand(1, $_height-5), "*", $_md_color);
}
for ($i=0; $i < $_code_length ; $i++) {
$_md_color = imagecolorallocate($_img, mt_rand(0,102), mt_rand(0,102), mt_rand(0,102));
imagestring($_img, 5, $i * $_width/$_code_length+ mt_rand(1, 10), mt_rand(1, $_height/2), $_SESSION["code"][$i], $_md_color);
}
header("Content-Type:image/png");
imagepng($_img);
imagedestroy($_img);
}