首頁 >後端開發 >php教程 >使用PHP和GD庫產生影像驗證碼

使用PHP和GD庫產生影像驗證碼

WBOY
WBOY原創
2023-05-11 08:34:351065瀏覽

隨著網路的發展,越來越多的網站需要使用驗證碼來防止惡意註冊、爬蟲等行為。而影像驗證碼是一種常見的驗證碼形式,它透過展示一張包含隨機字元或數字的影像,讓使用者在輸入正確的驗證碼後才能進行下一步操作。本文將介紹如何使用PHP和GD庫產生影像驗證碼。

GD庫是一個影像處理庫,可用於產生、處理和操作各種影像格式。 PHP已經內建了GD函式庫,並提供了許多函數可用於建立和操作影像,因此使用PHP和GD庫產生影像驗證碼非常方便。

步驟一:產生驗證碼文字

首先,我們需要產生一段隨機字串,這段字串將會被顯示在驗證碼圖像上。可以使用PHP內建函數rand()和chr()產生指定長度的ASCII字元:

$code = '';
$length = 4;
for ($i = 0; $i < $length; $i++) {
    $code .= chr(rand(97, 122));
}

上面的程式碼使用ASCII碼值在97到122之間產生一段四個字元的隨機字串。可以根據自己的需求修改這段程式碼以產生包含數字的字串,或增加字串長度。

步驟二:建立畫布

產生驗證碼文字後,我們需要建立一個畫布來展示它。使用PHP內建函數imagecreate()建立一個指定寬高的畫布:

$width = 120;
$height = 40;
$image = imagecreate($width, $height);

上面的程式碼建立了一個寬120像素、高40像素的畫布$image。

步驟三:設定背景色和文字顏色

為了讓驗證碼圖像更容易識別,我們需要設定一些顏色,包括背景色、文字顏色等。使用PHP內建函數imagecolorallocate()建立一個顏色:

$bg_color = imagecolorallocate($image, 255, 255, 255); // 将背景色设置为白色
$text_color = imagecolorallocate($image, 0, 0, 0); // 将文字颜色设置为黑色

上面的程式碼將背景色設為白色,將文字顏色設為黑色。可以根據自己的需求修改顏色值。

步驟四:加入乾擾線和雜訊

為了增加驗證碼的難度,我們可以加入一些幹擾線和雜訊。使用PHP內建函數imageline()建立幹擾線:

for ($i = 0; $i < 5; $i++) {
    $line_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); // 生成一种随机颜色
    imageline($image, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $line_color); // 在随机位置生成一条干扰线
}

上面的程式碼產生了5條隨機的干擾線。可以根據自己的需求增加或減少干擾線數量。

使用PHP內建函數imagesetpixel()建立雜訊:

for ($i = 0; $i < 100; $i++) {
    $noise_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); // 生成一种随机颜色
    imagesetpixel($image, rand(0, $width), rand(0, $height), $noise_color); // 在随机位置生成一个噪点
}

上面的程式碼產生了100個隨機的雜訊。可以依照自己的需求增加或減少雜訊數量。

步驟五:新增文字

最後,我們需要將產生的驗證碼文字新增到畫布上。使用PHP內建函數imagettftext()建立文字:

$font_path = 'font.ttf'; // 字体文件路径
$font_size = 20; // 字体大小
$x = 20; // 文本起始横坐标
$y = 30; //文本起始纵坐标
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_path, $code); // 将验证码文本添加到画布上

上面的程式碼使用字體檔案font.ttf建立了大小為20的文本,將文字新增到了畫布的指定位置。

步驟六:輸出映像

最後,我們需要將產生的驗證碼映像輸出到瀏覽器或儲存到檔案。使用PHP內建函數imagepng()將圖片輸出到瀏覽器:

header('Content-Type: image/png');
imagepng($image);

上面的程式碼設定輸出類型為image/png,將畫布$image以PNG格式輸出到瀏覽器。也可以使用其他圖片格式,如JPEG、GIF等。

完整程式碼如下:

$code = '';
$length = 4;
for ($i = 0; $i < $length; $i++) {
    $code .= chr(rand(97, 122));
}

$width = 120;
$height = 40;
$image = imagecreate($width, $height);

$bg_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 0, 0, 0);

for ($i = 0; $i < 5; $i++) {
    $line_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imageline($image, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), $line_color);
}

for ($i = 0; $i < 100; $i++) {
    $noise_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imagesetpixel($image, rand(0, $width), rand(0, $height), $noise_color);
}

$font_path = 'font.ttf';
$font_size = 20;
$x = 20;
$y = 30;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_path, $code);

header('Content-Type: image/png');
imagepng($image);

使用PHP和GD庫產生影像驗證碼非常簡單,只需遵循上述步驟即可。對於有一定程式設計基礎的人員,也可以進一步優化生成流程,例如使用更複雜的字元或數字組合、自訂字體等方式。但不管是什麼樣式的圖像驗證碼,它都是一種防範網路詐欺的基本工具,為網路安全建置做出了重要貢獻。

以上是使用PHP和GD庫產生影像驗證碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn