欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP 5 中图片验证码的制作

程序员文章站 2022-05-13 17:20:45
...

一、应用场景

在 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);
?>