1. 程式人生 > >PHP 生成驗證碼(+圖片沒有顯示的解決辦法)

PHP 生成驗證碼(+圖片沒有顯示的解決辦法)

subst 今天 部分 轉換 pan cde sta 操作 緩沖

今天有需要用到驗證碼,就敲了個,畢竟用途比較廣,所以打算把代碼留下來,以後肯定用得上的。當然,今天在做的時候也是有一些問題的,分享出來吧,記錄自己所犯的錯誤,避免以後再掉坑裏。

先給個效果圖(下面的真的是圖):

技術分享圖片

再上完整的代碼吧:

 1 <?php
 2     // 開啟 session
 3     session_start();
 4     
 5     // 丟棄輸出緩沖區的內容 **
 6     ob_clean();
 7     
 8     // 1 創建畫布
 9     $img = imagecreatetruecolor(100, 30);
10     
11     //
2 畫一個矩形並填充 12 $bgcolor = imagecolorallocate($img, mt_rand(120,255), mt_rand(120,255), mt_rand(120,255)); 13 imagefilledrectangle($img, 0, 0, 100, 30, $bgcolor); 14 15 // 3 在畫布上進行操作 16 17 // 3.1 定義字符串 18 $str = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890‘; 19 20
// 3.2 定義變量,存放驗證碼 21 $code = ‘‘; 22 23 // 3.2 加載自定義字體 24 $font_file = ‘./comic.ttf‘; 25 26 // 3.3 生成文字部分 27 for ($i = 0; $i < 4; $i++) { 28 // 定義字體顏色 29 $fontcolor = imagecolorallocate($img, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120)); 30 31 //
文字內容 32 $content = substr($str, mt_rand(0, strlen($str)-1), 1); 33 34 // 設置顯示坐標 35 $x = ($i * 100 / 4) + mt_rand(5, 10); 36 $y = mt_rand(17, 22); 37 38 // 把文字填充到畫布 39 imagefttext($img, 15, mt_rand(-5, 5), $x, $y, $fontcolor, $font_file, $content); 40 41 // 將文字內容賦值給 code 變量 42 $code .= $content; 43 } 44 45 // 3.4 將大寫字母轉換為小寫 46 $code = strtolower($code); 47 48 // 3.5 給 session 賦值 49 $_SESSION[‘code‘] = $code; 50 51 // 3.6 設置幹擾元素 52 for ($i = 0; $i < 200; $i++) { 53 $pointcolor = imagecolorallocate($img, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200)); 54 imagesetpixel($img, mt_rand(1, 99), mt_rand(1, 29), $pointcolor); 55 } 56 57 // 3.7 設置幹擾線 58 for ($i = 0; $i < 3; $i++) { 59 $linecolor = imagecolorallocate($img, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200)); 60 imageline($img, mt_rand(1, 99), mt_rand(1, 29), mt_rand(1, 99), mt_rand(1, 29), $pointcolor); 61 } 62 63 // 4 向瀏覽器輸出圖片頭信息 64 header(‘Content-Type:image/png‘); 65 66 // 5 輸出圖片到瀏覽器 67 imagepng($img); 68 69 // 6 銷毀圖片 70 imagedestroy($img); 71 ?>

遇到的一個比較嚴重的問題,也就是我沒能獨立解決的,就是 ob_clean() 那裏(註釋上加了倆 * 呢),最初是沒有這行代碼的。當然,現象就是怎麽都刷不出圖,看了手冊也沒找到解決辦法,最後還是依賴了度娘,找到了上面的解決辦法。(萬能的度娘,請收下我的膝蓋)

自我感覺註釋還是比較詳細的吧,反正我看得懂(馬馬虎虎)。

當然,ob_clean() 並不能解決所有的不能顯示的問題,具體問題具體分析,視自己的情況而定。

PHP 生成驗證碼(+圖片沒有顯示的解決辦法)