php網頁產生驗證碼實現程式

來源:互聯網
上載者:User

完整執行個體

自動檢測背景和字型,並隨機選取背景圖片中的一區塊範圍,隨機使用字型,顯示驗證字串時隨機顯示字型大小,字元間距,字元顏色等

 代碼如下 複製代碼

<?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"]);
?>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.