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


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

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

再上完整的代碼吧:

 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() 並不能解決所有的不能顯示的問題,具體問題具體分析,視自己的情況而定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM