首先在表單頁面展現之前,生成一副圖片,并添加上一些干擾像素或線段,防止OCR程序自動識別,再由PHP程序自動生成隨機的待驗證的一串數字和字母組合的字符,調用imagettftext()函數畫到圖片中,并把這串字符保存到Session級變量中.
完整實例:自動檢測背景和字體,并隨機選取背景圖片中的一塊范圍,隨機使用字體,顯示驗證字符串時隨機顯示字體大小,字符間距,字符顏色等,代碼如下:
- <?php
- /**
- * Class for Validate image
- * @author zcs
- * @version 1.0-20090828
- */
- session_start();
- class validimg
- {
- //背景圖片目錄
- var $backgroundpath = ‘validbg’;
- //生成驗證碼寬度
- var $width =’80′;
- //生成驗證碼高度
- var $height =’25′;
- //背景
- var $background;
- //驗證文本
- var $text=’abcd’;
- //字體目錄
- var $fontpath = ‘validbg’;
- //字體
- var $font=’simhei.ttf’;
- //字體寬度
- var $font_width = ’20′;
- function validimg($text)
- {
- $this->text = $text;
- //隨機選取一個背景文件
- $bgdir = @dir($this->backgroundpath);
- while(false !== ($image = $bgdir ->read()))
- {
- if($image != ‘.’ && $image != ‘..’ && $this->checktype($image) != false)
- {
- $backgroundarr[] = $image;
- }
- }
- $bgdir->close();
- //隨機選取一個字體文件
- $fonts = @dir($this->fontpath);
- while(false !== ($font = $fonts ->read()))
- {
- if($font != ‘.’ && $font != ‘..’ && $this->checktype($font,’FONT’) != false)
- {
- $fontsarr[] = $font;
- }
- }
- $fonts->close();
- $this->font = $fontsarr[array_rand($fontsarr,1)];
- $this->background = $backgroundarr[array_rand($backgroundarr,1)];
- $this->output();
- }
- //創建背景圖像handdle
- function createbackground()
- {
- switch ($this->checktype($this->background))
- {
- case ‘jpg’:
- $bghanddle = @imagecreatefromjpeg( $this->backgroundpath.’/’.$this->background);
- break;
- case ‘gif’:
- $bghanddle = @imagecreatefromgif( $this->backgroundpath.’/’.$this->background);
- break;
- case ‘png’:
- $bghanddle = @imagecreatefrompng( $this->backgroundpath.’/’.$this->background);
- break;
- default:
- }
- return $bghanddle;
- }
- //檢查文件類型
- function checktype( $image,$type = ‘IMAGE’)
- {
- $ext = substr( $image, strrpos($image,’.')+1);
- if($type == ‘IMAGE’)
- {
- if ($ext == ‘jpg’ || $ext ==’gif’ || $ext ==’png’)
- return $ext;
- else return false;
- }else if($type == ‘FONT’)
- {
- if ($ext == ‘ttf’)
- return $ext;
- else return false;
- }
- }
- //輸出
- function output()
- {
- header(“content-type:image/png;”);
- //生成圖像
- $img = @imagecreatetruecolor( $this->width,$this->height);
- $bghanddle = $this->createbackground();
- //從背景圖像隨機位置載入一塊作為背景
- if($bghanddle)
- {
- $randx=rand(0,(imagesx($bghanddle) – $this->width));
- $randy=rand(0,(imagesy($bghanddle) – $this->height));
- }
- imagecopy($img,$bghanddle,0,0,$randx,$randy,$this->width,$this->height);
- //隨機選擇角度 字體大小 坐標輸出文字
- for($i=0;$i<strlen($this->text);$i++)
- {
- $angle = rand(-30,30);
- $fontsize = rand(15,20);
- $x = rand($this->font_width*$i,$this->font_width*$i+10);
- $color = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
- imagettftext($img,$fontsize,$angle,$x,20,$color,$this->fontpath.’/’.$this->font,substr($this->text,$i,1));
- }
- imagepng($img);
- //釋放資源
- imagedestroy($img);
- imagedestroy($bghanddle);
- }
- }
- new validimg($_SESSION['valid']);
- ?>
測試文件validtest.php,代碼如下:
- <?php
- /**
- * 驗證碼測試
- * @author zcs
- */
- session_start();
- $_SESSION['valid']= randstr();
- echo $_SESSION['valid'];
- //隨機生成字符串
- function randstr($num=4)
- {
- $chars = ‘ABDEFGHJKLMNPQRSTVWXYabdefghijkmnpqrstvwxy23456789′;
- $randstr=”;
- for($i=0;$i<$num;$i++)
- {
- $randstr.=substr($chars,rand(0,strlen($chars)),1);
- }
- return $randstr;
- }
- ?>
- <img src=”validimg.php” />
- 生成gif動態驗證碼,PHP生成GIF動畫來實現動態圖片驗證碼,以下是實現過程,ImageCode函數通過GIFEncoder類實現的GIF動畫
- /**
- * ImageCode 生成GIF圖片驗證
- * @param $string 字符串
- * @param $width 寬度
- * @param $height 高度
- * */
- function ImageCode($string = '', $width = 75, $height = 25)
- {
- $authstr = $string ? $string : ((time() % 2 == 0) ? mt_rand(1000, 9999) : mt_rand(10000, 99999));
- $board_width = $width;
- $board_height = $height;
- // 生成一個32幀的GIF動畫
- for($i = 0; $i < 32; $i++)
- {
- ob_start();
- $image = imagecreate($board_width, $board_height);
- imagecolorallocate($image, 0,0,0);
- // 設定文字顏色數組
- $colorList[] = ImageColorAllocate($image, 15,73,210);
- $colorList[] = ImageColorAllocate($image, 0,64,0);
- $colorList[] = ImageColorAllocate($image, 0,0,64);
- $colorList[] = ImageColorAllocate($image, 0,128,128);
- $colorList[] = ImageColorAllocate($image, 27,52,47);
- $colorList[] = ImageColorAllocate($image, 51,0,102);
- $colorList[] = ImageColorAllocate($image, 0,0,145);
- $colorList[] = ImageColorAllocate($image, 0,0,113);
- $colorList[] = ImageColorAllocate($image, 0,51,51);
- $colorList[] = ImageColorAllocate($image, 158,180,35);
- $colorList[] = ImageColorAllocate($image, 59,59,59);
- $colorList[] = ImageColorAllocate($image, 0,0,0);
- $colorList[] = ImageColorAllocate($image, 1,128,180);
- $colorList[] = ImageColorAllocate($image, 0,153,51);
- $colorList[] = ImageColorAllocate($image, 60,131,1);
- $colorList[] = ImageColorAllocate($image, 0,0,0);
- $fontcolor = ImageColorAllocate($image, 0,0,0);
- $gray = ImageColorAllocate($image, 245,245,245);
- $color = imagecolorallocate($image, 255,255,255);
- $color2 = imagecolorallocate($image, 255,0,0);
- imagefill($image, 0, 0, $gray);
- $space = 15; // 字符間距
- if($i > 0) // 屏蔽第一幀
- {
- for ($k = 0; $k < strlen($authstr); $k++)
- {
- $colorRandom = mt_rand(0,sizeof($colorList)-1);
- $float_top = rand(0,4);
- $float_left = rand(0,3);
- imagestring($image, 6, $space * $k, $top + $float_top, substr($authstr, $k, 1), $colorList[$colorRandom]);
- }
- }
- for ($k = 0; $k < 20; $k++)
- {
- $colorRandom = mt_rand(0,sizeof($colorList)-1);
- imagesetpixel($image, rand()%70 , rand()%15 , $colorList[$colorRandom]);
- }
- // 添加干擾線
- for($k = 0; $k < 3; $k++)
- {
- $colorRandom = mt_rand(0, sizeof($colorList)-1);
- // $todrawline = rand(0,1);
- $todrawline = 1;
- if($todrawline)
- {
- imageline($image, mt_rand(0, $board_width), mt_rand(0,$board_height), mt_rand(0,$board_width), mt_rand(0,$board_height), $colorList[$colorRandom]);
- }
- else
- {
- $w = mt_rand(0,$board_width);
- $h = mt_rand(0,$board_width);
- imagearc($image, $board_width - floor($w / 2) , floor($h / 2), $w, $h, rand(90,180), rand(180,270), $colorList[$colorRandom]);
- }
- }
- imagegif($image);
- imagedestroy($image);
- $imagedata[] = ob_get_contents();
- ob_clean();
- ++$i;
- }
- $gif = new GIFEncoder($imagedata);
- Header ('Content-type:image/gif');
- echo $gif->GetAnimation();
- }
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>無標題文檔</title>
- <script language="javascript">
- function refresh_code()
- {
- form1.imgcode.src="verifycode.php?a="+Math.random();
- }
- </script>
- </head>
- <body>
- <form id="form1" name="form1" method="post" action="checkcode.php">
- <label for="code">驗證碼:</label>
- <input type="text" name="code" id="textfield" />
- <img id="imgcode" src="VerifyCode.php" alt="驗證碼" />
- <a href="javascript:refresh_code()">看不清?換一個</a>
- <input type="submit" name="button" id="button" value="提交" />
- </form>
- </body>
- </html>
checkcode.php文件如下:
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <?php
- ini_set('display_errors', 'Off');
- session_start();
- if((strtoupper($_POST["code"])) == strtoupper(($_SESSION["VerifyCode"]))){
- print("驗證碼正確,");
- }else{
- print("驗證碼錯誤,");
- }
- echo "提交的驗證碼:".strtoupper($_POST["code"]).",正確的驗證碼:".strtoupper($_SESSION["VerifyCode"]);
- ?>
新聞熱點
疑難解答