图形验证码

绘制图形验证码效果如下图:

 <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);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值