第一步: 创建一个画布
第二步: 创建颜色
第三步: 准备字符
第四步: 往 画布上写字符
第五步: 画干扰线 (点)
第六步: 输出格式
第七步: 输出图片
第八步: 销毁资源
- <?php
- verify();
- function verify($width = 100 , $height = 40 , $num = 5 , $type = 3 ){
- //1 创建画布
- $image = imagecreatetruecolor($width , $height);
- //2 创建颜色 // 因为后边总是用, 所以写了两个函数, 分别是 lightColor(浅颜色)deepColor(深颜色)
- //3 创建字符 // 这里是自己选择的类型, 1 就是纯数字, 2 就是纯小字母, 3 就是数字大小写字母的混合
- switch($type){
- case 1:
- // 定义字符串
- $str = "0123456789";
- // 打乱字符串
- $strNew = str_shuffle($str);
- // 截取 $num 个
- $string = substr($strNew , 0 , $num);
- break;
- case 2:
- // 定义字符
- $arr = range('a' , 'z');
- // 打乱字符串数组
- shuffle($arr);
- // 截取
- $tmp = array_slice($arr , 0 , $num);
- // 连成字符串
- $string = join('' , $tmp);
- break;
- case 3:
- $str = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
- $string = substr(str_shuffle($str) , 0 , $num);
- break;
- }
- // 给背景填充浅颜色 // 背景颜色太深的话验证码就看不清了
- imagefilledrectangle($image , 0 , 0 , $width , $height , lightColor($image));
- //4 往画布上写入字符
- for($i = 0; $i<$num; $i++) { // 因为我们设定的是输出 5 个字符, 所以 $i 是小于的 $num
- //floor 是取整,$width / $num 把宽度分了 $num 块地,*$i 是一个字符占一块地, 以免全都堆在一块看不出来
- $x = floor($width / $num) * $i;
- $y = mt_rand(10 , $height - 20);
- imagechar ($image , 5 , $x , $y , $string[$i] , deepColor($image));
- }
- //5 画干扰线点
- // 干扰线
- for($i = 0; $i<$num; $i++) {
- imagearc ($image , mt_rand(10 , $width) , mt_rand(10 , $height) , mt_rand(10 , $width) , mt_rand(10 , $height) , mt_rand(0 , 10) , mt_rand(0 , 270) , deepColor($image));
- }
- // 干扰点
- for( $i = 0; $i<50; $i++) {
- imagesetpixel($image , mt_rand(0 , $width) , mt_rand(0 , $height) , deepColor($image));
- }
- ob_clean();// 擦除缓冲区
- //6 告诉浏览器输出格式: png
- header("Content-type: image/png");
- //7 输出图片
- imagepng($image);
- //8 销毁
- imagedestroy($image);
- return $string;
- //echo $string;
- }
- // 设置深浅颜色
- function lightColor ($image) {
- return imagecolorallocate($image , mt_rand(120 , 255) , mt_rand(120 , 255) , mt_rand(120 , 255));
- }
- function deepColor ($image) {
- return imagecolorallocate($image , mt_rand(0 , 120) , mt_rand(0 , 120) , mt_rand(0 , 120));
- }
- ?>
特别说明:
ob_clean();// 擦除缓冲区
之前是没有加上这个的, 结果就告诉我因存在错误而无法显示, 如下图:
不过幸运的是, 在百度上找到答案了: https://blog.csdn.net/ghbfgb/article/details/50845075 加上之后, 就很轻易的解决了这个问题, 现在的效果是这样的:
好了
来源: http://www.bubuko.com/infodetail-2536866.html