PHP生成图像验证码的方法小结(2种方法)

本文介绍两种PHP生成验证码图像的方法:一种是生成加法运算验证码图片,另一种是生成字符验证码图片,并详细展示了每种方法的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文实例讲述了PHP生成图像验证码的方法。分享给大家供大家参考,具体如下:

1、生成加法运算验证码图片

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
session_start ();
/*定义头文件为图片*/
header( "Content-type: image/png" );
/*生成验证码*/
/*创建图片设置字体颜色*/
$im = imagecreate( $w , $h );
$red = imagecolorallocate( $im , 255, 255, 255);
$white = imagecolorallocate( $im , 255, 255, 255);
/*随机生成两个数字*/
$num1 = rand(1, 20);
$num2 = rand(1, 20);
$_SESSION [ "administratorConfirmCode" ] = $num1 + $num2 ;
/*设置图片背景颜色*/
$gray = imagecolorallocate( $im , 118, 151, 199);
$black = imagecolorallocate( $im , mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
/*创建图片背景*/
imagefilledrectangle( $im , 0, 0, 100, 24, $black );
/*在画布上随机生成大量点*/
for ( $i = 0; $i < 80; $i ++) {
   imagesetpixel( $im , rand(0, $w ), rand(0, $h ), $gray );
}
/*将计算验证码写入到图片中*/
imagestring( $im , 5, 5, 4, $num1 , $red );
imagestring( $im , 5, 30, 3, "+" , $red );
imagestring( $im , 5, 45, 4, $num2 , $red );
imagestring( $im , 5, 70, 3, "=" , $red );
imagestring( $im , 5, 80, 2, "?" , $white );
/*输出图片*/
imagepng( $im );
imagedestroy( $im );

2、生成字符验证码图片【值得注意的是在字体哪里,需要引入实际的字体路径,否则,可能出现图像显示不了验证码】

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
session_start ();
/*设置文件头为图片输出*/
Header( "Content-type: image/JPEG" );
/*调用生成验证码函数*/
$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234565789" ;
$result = "" ;
for ( $i =0; $i < $length ; $i ++){
   $num [ $i ]=rand(0,61);
   $result .= $str [ $num [ $i ]];
}
$text = $result ;
$_SESSION [ "administratorConfirmCode" ] = $text ;
/*设置图片的宽度和高度*/
$im_x = $w ;
$im_y = $y ;
/*创建图片*/
$im = imagecreatetruecolor( $im_x , $im_y );
$text_c = ImageColorAllocate( $im , mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
$tmpC0 =mt_rand(100,255);
$tmpC1 =mt_rand(100,255);
$tmpC2 =mt_rand(100,255);
$buttum_c = ImageColorAllocate( $im , $tmpC0 , $tmpC1 , $tmpC2 );
imagefill( $im , 16, 13, $buttum_c );
/*字体文件*/
$font = _WEB_DIR_. '/font/comic.ttf' ;
for ( $i =0; $i < strlen ( $text ); $i ++){
   $tmp = substr ( $text , $i ,1);
   $array = array (-1,1);
   $p = array_rand ( $array );
   $an = $array [ $p ]*mt_rand(1,10); //角度
   $size = 28;
   imagettftext( $im , $size , $an , 15+ $i * $size , 35, $text_c , $font , $tmp );
}
/*将字符写入文件中*/
$distortion_im = imagecreatetruecolor ( $im_x , $im_y );
imagefill( $distortion_im , 16, 13, $buttum_c );
for ( $i =0; $i < $im_x ; $i ++) {
   for ( $j =0; $j < $im_y ; $j ++) {
     $rgb = imagecolorat( $im , $i , $j );
     if ( (int)( $i +20+sin( $j / $im_y *2*M_PI)*10) <= imagesx( $distortion_im )&& (int)( $i +20+sin( $j / $im_y *2*M_PI)*10) >=0 ) {
       imagesetpixel ( $distortion_im , (int)( $i +10+sin( $j / $im_y *2*M_PI-M_PI*0.1)*4) , $j , $rgb );
     }
   }
}
/*干扰元素点的数量*/
$count = 160;
/*创建干扰元素点*/
for ( $i =0; $i < $count ; $i ++){
   $randcolor = ImageColorallocate( $distortion_im ,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
   imagesetpixel( $distortion_im , mt_rand()% $im_x , mt_rand()% $im_y , $randcolor );
}
/*创建干扰线条*/
$rand = mt_rand(5,30);
$rand1 = mt_rand(15,25);
$rand2 = mt_rand(5,10);
for ( $yy = $rand ; $yy <=+ $rand +2; $yy ++){
   for ( $px =-80; $px <=80; $px = $px +0.1){
     $x = $px / $rand1 ;
     if ( $x !=0){
       $y =sin( $x );
     }
     $py = $y * $rand2 ;
     imagesetpixel( $distortion_im , $px +80, $py + $yy , $text_c );
   }
}
/*以PNG格式将图像输出到浏览器*/
ImagePNG( $distortion_im );
/*销毁图像*/
ImageDestroy( $distortion_im );
ImageDestroy( $im );


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值