PHP(11) 图像型的验证码
 
在用户登录程序(版本1)中,我们曾经提到过验证码主要分为字符型和图像型两种,而字符型又可以分为数字型和混合型两种(这些分类是我的分类,可以存在偏差,请多包涵!^_^)。在上两篇博文中,我们已经将字符型的验证码实现了,这次,我们再次我们的程序做一次升级----图像型验证码
 
 
如果我们在PHP中来处理图像的话,那么就必须依赖于GD(Graphics Draw)库,还记得我们在php.ini中启用过php_gd2.dll吗,启用该文件的目的就是为了来处理图像的!
 
下面我们就来了解一下GD函数库吧!
 
1. p_w_picpath_create和p_w_picpathcreatetruecolor
 
两个函数的目的是一样的,都是创建一个图像资源,语法结构也
一样的
 
$变量名称 = p_w_picpathcreate(宽度,高度);
 
 
$变量名称 = p_w_picpathcreatetruecolor(宽度,高度);
 
两者唯一的区别在于:前者是基于调色板;后者基于真彩色(推荐使用)
 
2. p_w_picpathcolorallocate
 
功能:为图像来分配一个颜色,也就是说这种颜色可能在图像中使用,但具体的是在前景色中使用;还是在背景色或填充色中使用,并不固定,由用户来决定。
 
$变量名称 = p_w_picpathcolorallocate($图像资源名称,红色,绿色,蓝色);
 
3. p_w_picpathfill
 
功能:区域填充
 
语法:[$变量名称=]p_w_picpathfill($图像资源名称,x,y,颜色);
 
需要提醒各位的是:颜色不可以直接来书写,必须使用imagecolorallocate来分配
 
4. p_w_picpathstring和p_w_picpathttftext
 
功能均为在图像中书写文本,不过p_w_picpathstring一般用来使用内置字体来书写文本,而且文本不能带有旋转样式,如果想通过p_w_picpathstring+外部字体来书写文本时,那么必须使用p_w_picpathloadfont来加载字体;而p_w_picpathttftext则使用TrueType 字体在图像内书写文本。
 
[$变量名称=]p_w_picpathstring($图像资源名称,字号,x,y,”内容”,颜色);
 
[$变量名称=]p_w_picpathttftext($图像资源名称,字号,旋转角度,x,y,颜色,”字体文件”,”内容”);
 
5.  p_w_picpathfilledrectangle、p_w_picpatharc、p_w_picpathline、p_w_picpathsetpixel
 
p_w_picpathfillledrectangle的功能为绘制填充的矩形
 
p_w_picpatharc的功能为在图布上绘制圆弧
 
p_w_picpathline的功能为在画布上绘制线段
 
p_w_picpathsetpixel的功能为在画布上绘制像素点
 
6. p_w_picpathgif、p_w_picpathjpeg、p_w_picpathpng
 
p_w_picpathgif的功能为将图像资源作为gif格式输出到屏幕或生成文件
 
p_w_picpathjpeg的功能为将图像资源作为jpeg格式输出到屏幕或生成文件
 
p_w_picpathpng的功能为将图像资源作为png格式输出到屏幕或生成文件
 
7.     p_w_picpathdestroy
 
p_w_picpathdestroy的功能为销毁图像资源
 
好了,现在的这几个函数,我们差不多就都理解了,我们现在来实现一个简单的案例:
 
案例1:
 
$width   = "120";
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 
$height   = "45";

 
$img = p_w_picpathcreatetruecolor($width,$height);

 
$black = p_w_picpathcolorallocate($img,0,0,0);

 
$white = p_w_picpathcolorallocate($img,255,255,255);

 
p_w_picpathfill( $img , 0 , 0 , $black );

 
p_w_picpathfilledrectangle( $img , 1 , 1 , $width - 2 , $height - 2 , $white );

 
$char = rand(1000,9999);

 
p_w_picpathstring( $img , 5 , 40 , 15 , $char , $black );

 
p_w_picpathjpeg( $img );
 
运行效果如下:
 
 
 
 
案例2:
 
$width   = "120";

 
$height   = "45";

 
$img = p_w_picpathcreatetruecolor($width,$height);

 
$black = p_w_picpathcolorallocate($img,0,0,0);

 
$white = p_w_picpathcolorallocate($img,255,255,255);

 
p_w_picpathfill( $img , 0 , 0 , $black );

 
p_w_picpathfilledrectangle( $img , 1 , 1 , $width - 2 , $height - 2 , $white );

 

for ( $i = 0 ; $i < 4 ; $i ++)

 
{

 
    $x = 40 + $i * 15;

 
    $char = rand(0,9);

 
    $color = p_w_picpathcolorallocate($img,rand(0,255),rand(50,100),rand(50,120)); 

 
    p_w_picpathstring($img,5,$x,15,$char,$color);

 
}

 
p_w_picpathjpeg( $img );
 
运行效果如下:
 
 
案例3:
 
$width   = "120";

 
$height   = "45";

 
$img = p_w_picpathcreatetruecolor($width,$height);

 
$black = p_w_picpathcolorallocate($img,0,0,0);

 
$white = p_w_picpathcolorallocate($img,255,255,255);

 
p_w_picpathfill( $img , 0 , 0 , $black );

 
p_w_picpathfilledrectangle( $img , 1 , 1 , $width - 2 , $height - 2 , $white );

 

for ( $i = 0 ; $i < 4 ; $i ++)

 
{

 
    $x = 40 + $i * 15;

 
    $char = rand(0,9);

 
    $fontSize = rand(15,20);

 
    $angle = rand(-20,20);

 
    $y = rand(25,35);

 
    $color = p_w_picpathcolorallocate($img,rand(0,255),rand(50,100),rand(50,120)); 

 
    p_w_picpathttftext($img,$fontSize,$angle,$x,$y,$color,"PilsenPlakat.ttf",$char);

 
}

 
p_w_picpathjpeg( $img );
 
运行效果如下:
 
 
 
案例4:在案例3的基础上添加一些杂点
 

$width   = "120";

 
$height   = "45";

 
$img = p_w_picpathcreatetruecolor($width,$height);

 
$black = p_w_picpathcolorallocate($img,0,0,0);

 
$white = p_w_picpathcolorallocate($img,255,255,255);

 
p_w_picpathfill( $img , 0 , 0 , $black );

 
p_w_picpathfilledrectangle( $img , 1 , 1 , $width - 2 , $height - 2 , $white );

 
for ( $i = 0 ; $i < 5 ; $i ++)

 
{

 
    p_w_picpathline($img,rand(0,$width),rand(0,$height),rand(0,$width),rand(0,$height),$black);

 
}

 
for ( $i = 0 ; $i < 50 ; $i ++)

 
{

 
    p_w_picpathsetpixel($img,rand(0,$width),rand(0,$height),$black);

 
}

 
for ( $i = 0 ; $i < 4 ; $i ++)

 
{

 
    $x = 40 + $i * 15;

 
    $char = rand(0,9);

 
    $fontSize = rand(15,20);

 
    $angle = rand(-20,20);

 
    $y = rand(25,35);

 
    $color = p_w_picpathcolorallocate($img,rand(0,255),rand(50,100),rand(50,120)); 

 
    p_w_picpathttftext($img,$fontSize,$angle,$x,$y,$color,"PilsenPlakat.ttf",$char);

 
}

 
p_w_picpathjpeg( $img );
 
 
运行效果如下:
 
 

好了,先写这些,剩余的明天再补,因为时间太晚了,明天还有课!哈哈!不好意思!各位晚安!!