当前位置:Gxlcms > PHP教程 > PHP5中图片验证码的制作

PHP5中图片验证码的制作

时间:2021-07-01 10:21:17 帮助过:17人阅读

一、应用场景

在 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 参数,使用空字符串('')。通过 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,'msyh.ttf',$str);//rand(3,10)倾斜度。msyh.ttf 是微软雅黑字体,可在 C:\Windows\Fonts (Windows XP、Windows 7)找到。然后拷贝到该文件的目录。Windows 下之所以能够显示中文,是因为系统安装了中文字体
header("Content-type: image/jpeg");
imagejpeg($im);
?>

人气教程排行