php验证码的制作
2016-02-13 16:50
851 查看
<?php class Vcode { private $width; //宽 private $height; //高 private $num; //数量 private $code; //验证码 private $img; //图像的资源 function __construct($width=120, $height=30, $num=4) { $this->width = $width; $this->height = $height; $this->num = $num; $this->code = $this->createcode(); } //获取字符的验证码, 用于保存在服务器中 function getcode() { return $this->code; } //输出图像 function outimg() { //创建背景 (颜色, 大小, 边框) $this->createback(); //画字 (大小, 字体颜色) $this->outstring(); //干扰元素(点, 线条) $this->setdisturbcolor(); //输出图像 $this->printimg(); } //创建背景 private function createback() { //创建资源 $this->img = imagecreatetruecolor($this->width, $this->height); //设置随机的背景颜色 $bgcolor = imagecolorallocate($this->img, rand(225, 255), rand(225, 255), rand(225, 255)); //设置背景填充 imagefill($this->img, 0, 0, $bgcolor); //画边框 $bordercolor = imagecolorallocate($this->img, 0, 0, 0); imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $bordercolor); } //画字 private function outstring() { for($i=0; $i<$this->num; $i++) { $color= imagecolorallocate($this->img, rand(0, 128), rand(0, 128), rand(0, 128)); $fontsize=rand(10,12); //字体大小 $x = 3+($this->width/$this->num)*$i; //水平位置 $y = rand(0, imagefontheight($fontsize)-3); //画出每个字符 imagechar($this->img, $fontsize, $x, $y, $this->code{$i}, $color); } } //设置干扰元素 private function setdisturbcolor() { //加上点数 for($i=0; $i<100; $i++) { $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 255), rand(0, 255)); //给验证码图片干扰点上色 imagesetpixel($this->img, rand(1, $this->width-2), rand(1, $this->height-2), $color); //用color颜色在x,y坐标上画一个点 } //加线条 for($i=0; $i<5; $i++) { $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 128), rand(0, 255)); //给验证码图片干扰弧线上色 imagearc($this->img,rand(-10, $this->width+10), rand(-10, $this->height+10), rand(30, 300), rand(30, 300), 55,44, $color); //画弧线 } } //输出图像 private function printimg() { if (imagetypes() & IMG_GIF) { header("Content-type: image/gif"); imagegif($this->img); } elseif (function_exists("imagejpeg")) { header("Content-type: image/jpeg"); imagejpeg($this->img); } elseif (imagetypes() & IMG_PNG) { header("Content-type: image/png"); imagepng($this->img); } else { die("No image support in this PHP server"); } } //生成验证码字符串 private function createcode() { $codes = "3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY"; // 去掉容易混淆的字符0oil012 $code = ""; for($i=0; $i < $this->num; $i++) { $code .=$codes{rand(0, strlen($codes)-1)};//rand()函数返回code字符串中任意一个位置 } return $code; } //用于自动销毁图像资源 function __destruct() { imagedestroy($this->img); } } 107 ?>
生成验证码的效果如图所示
,上面所示代码的文件名为vcode.class.php;我们在code.php文件中开启session,引用这个文件;
代码如下:
<?php //开启session session_start(); include "vcode.class.php"; //构造方法 $vcode = new Vcode(); //将验证码放到服务器自己的空间保存一份 $_SESSION['code'] = $vcode->getcode(); //将验证码图片输出 $vcode->outimg();
表单测试代码如下
<?php session_start(); if(isset($_POST['dosubmit'])) { if(strtoupper($_SESSION['code']) == strtoupper($_POST['code']) ) {//验证输入的验证码 echo "输入成功!<br>"; }else{ echo "输入不对!<br>"; } } ?> <body> <form action="reg.php" method="post"> username: <input type="text" name="username"> <br> password: <input type="password" name="password"> <br> code: <input type="text" onkeyup="if(this.value!=this.value.toUpperCase()) this.value=this.value.toUpperCase()" size="6" name="code"> <img src="code.php" onclick="this.src='code.php'" /> <br> <!-- 1、将在输入框中的字符,当keyup的时候自动将里面的字符转换成大写 2、点击图片是会切换验证码 --> <input type="submit" name="dosubmit" value="登 录"> <br> </form> </body>
相关文章推荐
- PHP session handler
- PHP 转编码函数
- php_imagick超强的PHP图片处理扩展
- php+uploadprogress实现上传进度功能
- PHP-CPP 安装
- php-fpm服务启动脚本
- php-fpm进程管理方式(static和dynamic)
- Phpmyadmin-3.4.8 安装配置
- ThinkPHP - 关联模型 - 多对多
- php编译添加扩展
- PHP处理服务器session问题导致的高负载
- php session 写入数据库
- PHP 首页导航栏源代码
- vsftp 安装 配置
- yii2从零开始一,安装
- phpstorm 常用设置
- 53个要点提高PHP编程效率
- PHP操作Mysql疑问?
- php等比例缩放图片及剪切图片代码分享
- php等比例缩放图片及剪切图片代码分享