Friday, 28. April 2006, 13:12:19
现在网上的垃圾信息越来越多,验证码也就显得越来越重要了。下面介绍一下怎么用php生成验证码。
验证码一般会做成图片,这样那些垃圾发送者才不容易识别,并且,由于版权的原因,现在php会生成png格式的图片而非gif格式。所以,要发送一个代表png图片的http头。
Header("Content-type: image/PNG");
然后,要生成图片的第一件事就是先创建一个图片,这要用imagecreate()函数。
resource imagecreate ( int x_size, int y_size )
其中,x_size是图片的长度,y_size是宽度。
比如
$im = imagecreate(58,28);
生成的图片是一张空的图片,这当然不是我们想要的。颜色是构成图片的一个重要的原素,ImageColorAllocate()函数可以用来定义自己所需要的颜色。
int imagecolorallocate ( resource image, int red, int green, int blue )
其中image是所定义的颜色要用在哪个图片上,red,green,blue则是用来指定颜色的rgb值。
有了颜色以后,下一步就是要把颜色涂在图片上了。这可能用imagefill()函数。
bool imagefill ( resource image, int x, int y, int color )
image是要涂色的图片,x,y是起始坐标,color则是颜色(这里的颜色就是用ImageColorAllocate()函数定义的颜色)。
这样,准备工作就做完了。下面要进行的就是最重要的一步了。怎么把验证码放在图片上。这可以借助imagestring()函数。它的作用就是把一个字符串水平地画在图片上。
bool imagestring ( resource image, int font, int x, int y, string s, int col )
image是要画字符串的图片,font是字体(如果font的值是1, 2, 3, 4 或 5,就会用内置的字体),x,y是起始坐标,s就是要画的字符串,col是字符串的颜色。
如果要做一个4位的只有数字的验证码,那么只要生成一个[1000,10000)区间内的随机数,然后把它画在图片上就可以了。
这样,验证码就基本完成了。不过要想让我们的验证码再牛一些,可以在背景上再画上一些乱点,这样那些机器人识别起来就更困难了。
imagesetpixel()函数可以完成这一操作。
bool imagesetpixel ( resource image, int x, int y, int color )
它可以在image上的x,y坐标上画一个颜色为color的点。这样,在随机的坐标画一个随机颜色的小点。
这样,我们所要的图片就作好了。最后一步,就是把它画出来了。这只要一个函数
ImagePNG(resource img)
它会把img图片画在浏览器上面。
然后,用
imagedestroy(resource img)
把图片的identifier所占用的内存释放掉就可以了。
假如我们用来生成图片的php文件叫img.php,那么在别的网页中,img.php就可以像普通的图片一样来使用了。如果要实现验证码功能,可以把img.php中生成的验证码存在
session中,这样就可以在所要验证的页面中来比较了。
另,需要注意,要生成动态图片php需要加载gd库,方法为去掉在/etc/php.ini中extension=gd.so前面的叹号就行了。(然后重启httpd服务)
本文参考了:
用PHP实现验证码功能PHP Manual