php验证码的制作
1 <?php
2 class Vcode {
3 private $width; //寬
4 private $height; //高
5 private $num; //數(shù)量
6 private $code; //驗(yàn)證碼
7 private $img; //圖像的資源
8 function __construct($width=120, $height=30, $num=4) {
9 $this->width = $width;
10 $this->height = $height;
11 $this->num = $num;
12 $this->code = $this->createcode();
13 }
14 //獲取字符的驗(yàn)證碼, 用于保存在服務(wù)器中
15 function getcode() {
16 return $this->code;
17 }
18 //輸出圖像
19 function outimg() {
20 //創(chuàng)建背景 (顏色, 大小, 邊框)
21 $this->createback();
22 //畫字 (大小, 字體顏色)
23 $this->outstring();
24 //干擾元素(點(diǎn), 線條)
25 $this->setdisturbcolor();
26 //輸出圖像
27 $this->printimg();
28 }
29 //創(chuàng)建背景
30 private function createback() {
31 //創(chuàng)建資源
32 $this->img = imagecreatetruecolor($this->width, $this->height);
33 //設(shè)置隨機(jī)的背景顏色
34 $bgcolor = imagecolorallocate($this->img, rand(225, 255), rand(225, 255), rand(225, 255));
35 //設(shè)置背景填充
36 imagefill($this->img, 0, 0, $bgcolor);
37 //畫邊框
38 $bordercolor = imagecolorallocate($this->img, 0, 0, 0);
39 imagerectangle($this->img, 0, 0, $this->width-1, $this->height-1, $bordercolor);
40 }
41
42 //畫字
43 private function outstring() {
44 for($i=0; $i<$this->num; $i++) {
45 $color= imagecolorallocate($this->img, rand(0, 128), rand(0, 128), rand(0, 128));
46 $fontsize=rand(10,12); //字體大小
47 $x = 3+($this->width/$this->num)*$i; //水平位置
48 $y = rand(0, imagefontheight($fontsize)-3);
49 //畫出每個(gè)字符
50 imagechar($this->img, $fontsize, $x, $y, $this->code{$i}, $color);
51 }
52 }
53
54 //設(shè)置干擾元素
55 private function setdisturbcolor() {
56 //加上點(diǎn)數(shù)
57 for($i=0; $i<100; $i++) {
58 $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 255), rand(0, 255));
59 //給驗(yàn)證碼圖片干擾點(diǎn)上色
60 imagesetpixel($this->img, rand(1, $this->width-2), rand(1, $this->height-2), $color);
61 //用color顏色在x,y坐標(biāo)上畫一個(gè)點(diǎn)
62 }
63
64 //加線條
65 for($i=0; $i<5; $i++) {
66 $color= imagecolorallocate($this->img, rand(0, 255), rand(0, 128), rand(0, 255));
67 //給驗(yàn)證碼圖片干擾弧線上色
68 imagearc($this->img,rand(-10, $this->width+10), rand(-10, $this->height+10), rand(30, 300), rand(30, 300), 55,44, $color);
69 //畫弧線
70 }
71 }
72
73 //輸出圖像
74 private function printimg() {
75 if (imagetypes() & IMG_GIF) {
76 header("Content-type: image/gif");
77 imagegif($this->img);
78 } elseif (function_exists("imagejpeg")) {
79 header("Content-type: image/jpeg");
80 imagejpeg($this->img);
81 } elseif (imagetypes() & IMG_PNG) {
82 header("Content-type: image/png");
83 imagepng($this->img);
84 } else {
85 die("No image support in this PHP server");
86 }
87
88 }
89
90 //生成驗(yàn)證碼字符串
91 private function createcode() {
92 $codes = "3456789abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXY";
93 // 去掉容易混淆的字符0oil012
94 $code = "";
95 for($i=0; $i < $this->num; $i++) {
96 $code .=$codes{rand(0, strlen($codes)-1)};//rand()函數(shù)返回code字符串中任意一個(gè)位置
97 }
98 return $code;
99 }
100
101 //用于自動(dòng)銷毀圖像資源
102 function __destruct() {
103 imagedestroy($this->img);
104 }
105
106 }
107 ?>
生成驗(yàn)證碼的效果如圖所示,上面所示代碼的文件名為vcode.class.php;我們?cè)赾ode.php文件中開啟session,引用這個(gè)文件;
代碼如下:
<?php//開啟sessionsession_start();include "vcode.class.php";//構(gòu)造方法$vcode = new Vcode();//將驗(yàn)證碼放到服務(wù)器自己的空間保存一份$_SESSION['code'] = $vcode->getcode();//將驗(yàn)證碼圖片輸出$vcode->outimg();表單測(cè)試代碼如下
<?phpsession_start(); if(isset($_POST['dosubmit'])) {if(strtoupper($_SESSION['code']) == strtoupper($_POST['code']) ) {//驗(yàn)證輸入的驗(yàn)證碼echo "輸入成功!<br>";}else{echo "輸入不對(duì)!<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、將在輸入框中的字符,當(dāng)keyup的時(shí)候自動(dòng)將里面的字符轉(zhuǎn)換成大寫2、點(diǎn)擊圖片是會(huì)切換驗(yàn)證碼 --><input type="submit" name="dosubmit" value="登 錄"> <br></form> </body>?
轉(zhuǎn)載于:https://www.cnblogs.com/hxjbc/p/5188057.html
總結(jié)
- 上一篇: Python 零碎信息-基础 02
- 下一篇: YTU 2586: 填空题B-字画鉴别