2009-04-29 02:41

[PHP] 驗證碼2

根據之前寫的[PHP] 驗證碼做了一些修正
  • 增加圖片類型的選擇
  • 隨機文字色彩
  • 隨機底部線條
  • 根據文字大小產生相對應的圖片
  1. <?php 
  2. /*定义header,声明图片文件,最好是png,无版权之扰; */  
  3. /*生成新的四位整数验证码 */ 
  4. header('Content-type:image/png'); 
  5. header('Content-Disposition:filename=image_code.png'); 
  6. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
  7. header('Cache-Control: no-store, no-cache, must-revalidate'); 
  8. header('Cache-Control: post-check=0, pre-check=0', false); 
  9. header('Pragma: no-cache'); 
  10.  
  11.  
  12. /* 字形檔的路徑 */ 
  13. $TTF="/var/lib/defoma/fontconfig.d/D/DejaVu-Serif-Bold.ttf"; 
  14.  
  15. /* 開啟 SESSION */ 
  16. if (!isset($_SESSION)) { session_start(); } 
  17.  
  18. /* 設定亂數種子 */ 
  19. mt_srand((double)microtime()*1000000); 
  20.  
  21.  
  22. /* 類型選擇 */ 
  23. switch ($_GET['t']) { 
  24. case 'post': 
  25.    //定義用來顯是在圖片上的文字 
  26.    $codeBase='ABCDEFGHJKLMNPRSTUVWXYZ23456789'; 
  27.  
  28.    $codeLength=5; //定義循環隨機抽取的位數 
  29.    $codeName='checkPostCode'; // 認證碼名稱  
  30.    $textSize=18; // 字體大小(點) 
  31.    $proportion=0.2; //字寬加乘比例 
  32.    break; 
  33.  
  34. case 'min_post': 
  35.    //定義用來顯是在圖片上的文字 
  36.    $codeBase='ABCDEFGHJKLMNPRSTUVWXYZ23456789'; 
  37.  
  38.    $codeLength=5; // 定義循環隨機抽取的位數 
  39.    $codeName='checkMinPostCode'; // 認證碼名稱  
  40.    $textSize=18; // 字體大小(點) 
  41.    $proportion=0.2; // 字寬加乘比例 
  42.    break; 
  43.  
  44. case 'shoutbox': 
  45.    //定義用來顯是在圖片上的文字 
  46.    $codeBase='1234567890'; 
  47.  
  48.    $codeLength=3; // 定義循環隨機抽取的位數  
  49.    $codeName='checkShoutCode'; // 認證碼名稱  
  50.    $imageX=60; $imageY=24; // 圖片的長寬 
  51.    $textSize=18; // 字體大小(點) 
  52.    $proportion=0.2; // 字寬加乘比例 
  53.    break; 
  54.  
  55. case 'comm': 
  56. default: 
  57.    //定義用來顯是在圖片上的文字 
  58.    $codeBase='1234567890';  
  59.  
  60.    $codeLength=3; // 定義循環隨機抽取的位數  
  61.    $codeName='checkMsgCode'; // 認證碼名稱  
  62.    $textSize=18; // 字體大小(點)  
  63.    $proportion=0.2; // 字寬加乘比例 
  64.    break; 
  65. } 
  66.  
  67. // 圖片的高度 
  68. $imageY=intval($textSize*(1+$proportion));  
  69. // 圖片的寬度 
  70. $imageX=$imageY*$codeLength;  
  71.  
  72.  
  73. /*建立圖片物件 */ 
  74. $im = @imagecreatetruecolor($imageX, $imageY) or die('Image Error'); 
  75.  
  76. /* 設定底色 */ 
  77. imagefill($im,0,0,  
  78.    imagecolorallocate($im, 255,255,255) 
  79. );  
  80.  
  81.  
  82. /* 建立筆刷 */ 
  83. $s=intval($textSize/8); 
  84. $brush = imagecreate($s,$s); 
  85. imagesetbrush($im,$brush); 
  86.  
  87. /*底色干擾線條 */ 
  88. $l=$codeLength*7; 
  89. for($i=0;$i<$l;$i++){  
  90.    imagefill($brush,0,0,imagecolorallocate( 
  91.        $brush, rand(127,255),rand(127,255),rand(127,255) 
  92.    )); 
  93.    imageline( 
  94.        $im, 
  95.        rand(0,$imageX), 
  96.        rand(0,$imageY), 
  97.        rand($imageY,$imageX), 
  98.        rand(0,$imageY), 
  99.        IMG_COLOR_BRUSHED 
  100.    ); 
  101. }  
  102.  
  103.  
  104. /*得到字串的長度;减1是因为截取字符是从0开始起算;*/ 
  105. $l = strlen($codeBase)-1;  
  106. $widgetSize=$imageX/$codeLength; 
  107. $codeStr = '';  
  108.  
  109. /*循環隨機抽取前面定義的文字*/  
  110. for($i=0;$i<$codeLength;$i++){  
  111.    /*每次随机抽取一位数字;从第一个字到该字串最大长度, */ 
  112.    $num=rand(0,$l);  
  113.    $codeStr.= $codeBase[$num];  
  114.  
  115.    /*利用true type字型來產生圖片 */ 
  116.    $Color = imagecolorallocate( //  文字顏色 
  117.        $im,rand(0,60),rand(0,60),rand(0,60) 
  118.    ); 
  119.    imagettftext( 
  120.        $im,  
  121.        $textSize,  
  122.        rand(-25,25),  
  123.        $widgetSize*($i+$proportion),  
  124.        $textSize,  
  125.        $Color,  
  126.        $TTF,  
  127.        $codeBase[$num] 
  128.    ); 
  129.  
  130.    /* 
  131.    imagettftext (int im, int size, int angle, 
  132.    int x, int y, int col, 
  133.    string fontfile, string text) 
  134.  
  135.    im 圖片物件 
  136.    size 文字大小 
  137.    angle 0度將會由左到右讀取文字,而更高的值表示逆時鐘旋轉 
  138.    x y 文字起始座標 
  139.    col 顏色物件 
  140.    fontfile 字形路徑,為主機實體目錄的絕對路徑,可自行設定想要的字型 
  141.    text 寫入的文字字串 
  142.    */ 
  143. } 
  144.  
  145.  
  146. /* 建立筆刷 */ 
  147. $s=intval($textSize/9); 
  148. $brush = imagecreate($s,$s); 
  149. imagesetbrush($im,$brush); 
  150.  
  151. /* 文字干擾像素 */ 
  152. $l=$codeLength*13; 
  153. for($i=0;$i<$l;$i++){ 
  154.    imagefill($brush,0,0,imagecolorallocate( 
  155.        $brush,rand(40,100),rand(40,100),rand(40,100) 
  156.    )); 
  157.    imagesetpixel( 
  158.        $im, 
  159.        rand(0,$imageX), 
  160.        rand(0,$imageY), 
  161.        IMG_COLOR_BRUSHED 
  162.    ); 
  163. } 
  164.  
  165.  
  166. /*用session来做验证也不错;注册session,名称为checkMsgCode, */ 
  167. /*其它页面只要包含了该图片 */ 
  168. /*即可以通过$_SESSION['checkMsgCode']来调用 */ 
  169. session_register($codeName); 
  170. $_SESSION[$codeName] = $codeStr; 
  171.  
  172. imagepng($im); 
  173. imagedestroy($im); 


輸出結果:

3 回應:

匿名 提到...

為什麼用我不行阿=皿=

Jax Hu 提到...

這個需要 GD 函式庫

匿名 提到...

GD那是甚麼 =口=