首頁 >後端開發 >php教程 >PHP 5 中圖片驗證碼的製作

PHP 5 中圖片驗證碼的製作

巴扎黑
巴扎黑原創
2016-12-07 14:03:491085瀏覽

一、應用場景

    在 WEB 網站中,圖片驗證碼經常被用來防止惡意地用戶註冊、發文等場景。在 PHP 中,圖片驗證碼主要是透過 GD 函式庫提供的 API 來完成的。

 

二、實現的方法

    驗證碼一般都是隨機的數字和字母組合的,可以透過隨機函數,十六進位函數 dechex 簡單實現。最關鍵的問題還是怎麼產生圖片。

<?php
//生成随机数-》创建图片-》随机数写进图片 -》输出到浏览器
for($i=0;$i<4;$i++) {
  $rand .= dechex(rand(1,15));
}
  
$im = imagecreatetruecolor(100,30);// 新建一个真彩色图像  x就是宽 ,y就是高
//设置颜色
// 为一幅图像分配颜色(相当于 PhotoShop 的调色板)
// imagecolorallocate ( resource image, int red, int green, int blue )  返回一个标识符,代表了由给定的 RGB 成分组成的颜色。
$bg = imagecolorallocate($im,0,0,0);//第一次对 imagecolorallocate() 的调用会给基于调色板的图像填充背景色。代表了由给定的 RGB 成分组成的颜色
  
$te = imagecolorallocate($im,225,225,225);
//把字符串写在图像左上角
//绘图函数  imagestring ( resource image, font, int x, int y, string s, int col ) 
//用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果 font 是 1,2,3,4 或 5,则使用内置字体。  
imagestring($im,5,rand(3,70),rand(0,16),$rand,$te);
//直接输出图像到浏览器
header("Content-type: image/jpeg");
// imagejpeg ( resource image [, string filename [, int quality]] )  filename 参数为可选,如果省略,则原始图像流将被直接输出。要省略 filename 参数而提供 quality 参数,使用空字符串(&#39;&#39;)。通过 header() 发送 Content-type: image/jpeg 可以使 PHP 脚本直接输出 JPEG 图像。
imagejpeg($im);
?>

三、製作複雜的圖片驗證碼

     有時驗證碼為了防止被一些圖片辨識工具識別,必須設定一些幹擾。例如在圖片上隨機加上一些線條或點。這主要透過 imageline() 和 imagesetpixel() 函數來實現。甚至製作中文驗證碼。

<?php
for($i=0;$i<4;$i++) {
  $rand .= dechex(rand(1,15));
}
  
$im = imagecreatetruecolor(100,30);
$bg = imagecolorallocate($im,0,0,0);
  
$te = imagecolorallocate($im,225,225,225);
//画线条
for($i=0; $i<3; $i++){
  $te2 = imagecolorallocate($im,rand(0,225),rand(0,225),rand(0,225));
//imageline ( resource image, int x1, int y1, int x2, int y2, int color )  用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。 
  imageline($im,rand(0,100),0,rand(0,100),rand(0,30),$te2);
}
//画点
for($i = 0; $i < 100; $i++){
  //imagesetpixel ( resource image, int x, int y, int color ) 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。 
  imagesetpixel($im,rand()%100,rand()%30,$te2);
}
  
$str = iconv("gbk","UTF-8","验证码");//把gbk编码转换成UTF-8,如果文件的编码是 UTF-8,则不需要这一步。因为我们的系统(Windows)自带的字体默认是用国际通用编码(UTF-8)模式来识别的,所以如果不做编码转换,可能无法正常显示。
imagettftext($im,12,rand(0,10),20,20,$te,&#39;msyh.ttf&#39;,$str);//rand(3,10)倾斜度。msyh.ttf 是微软雅黑字体,可在 C:\Windows\Fonts (Windows XP、Windows 7)找到。然后拷贝到该文件的目录。Windows 下之所以能够显示中文,是因为系统安装了中文字体
header("Content-type: image/jpeg");
imagejpeg($im);
?>


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