php验证码图像程序,PHP图形验证码程序

最近经常有人问我这个Blog中的图形验证码是如何做的.下面是这个php图形验证码的源程序.

欢迎指正.

class.image.php

/*

===========================================================

class.image.php  Zhu Weiwei

Copyright © 2006-2008

http://www.cncmm.com China. All Rights Reserved.

===========================================================

*/

class Image

{

PRivate $img;

private $width;

private $height;

private $color;

private $font;

private $mime="image/jpeg";

/* 1,GIF 2,JPEG 3,PNG */

private $type=2;

private $angle=0;

private $text;

private $textW;

private $textH;

private $size=5;

private $tcolor;

function __construct($w="100", $h="50"){

$this->width=$w;

$this->height=$h;

}

function create() {

if ($this->type != 1 && function_exists('imagecreatetruecolor')) {

// 本函数不能用于 GIF 文件格式

// 本函数需要 GD 2.0.1 或更高版本。

// 返回一个图像标识符,代表了一幅大小为 x_size 和 y_size 的黑色图像

$this->img=imagecreatetruecolor($this->width,$this->height);

}else {

$this->img=imagecreate($this->width,$this->height);

}

}

/*

* 1=GIF   2=JPG

* 3=PNG

*/

function createFromFile($f){

$imgInfo=getimagesize($f);

$this->type=$imgInfo[2];

switch($this->type){

case 1:

$this->loadGifFile($f);

break;

case 2:

$this->loadJpegFile($f);

break;

case 3:

$this->loadPngFile($f);

break;

default:

die("This Image Type Not Support loadimage !");

exit();

}

}

function loadGifFile($f){

// 1.6 -- 2.0.28

//二者之间版本的 GD 库时本函数不可用

$this->img=imagecreatefromgif($f ) or die("Load Gif picture error!") ;

$this->width=imagesx($this->img);

$this->height=imagesy($this->img);

$this->mime="image/gif";

$this->type=1;

}

function loadJpegFile($f){

//JPEG 支持仅在 PHP 与 GD-1.8 或更高版本一起编译时可用

$this->img=imagecreatefromjpeg($f) or die("Load Jpeg picture error!") ;

$this->width=imagesx($this->img);

$this->height=imagesy($this->img);

$this->mime="image/jpeg";

$this->type=2;

}

function loadPngFile($f){

$this->img=imagecreatefrompng($f ) or die("Load Png picture error!") ;

$this->width=imagesx($this->img);

$this->height=imagesy($this->img);

$this->mime="image/png";

$this->type=3;

}

function setBackgroundColor($r, $g, $b){

## 用color 颜色填充了的矩形

## 其左上角坐标为 x1,y1

## 右下角坐标为 x2,y2

## 0, 0 是图像的最左上角

$color =imagecolorallocate($this->img, $r, $g, $b);

return imagefilledrectangle($this->img, 0, 0, $this->width, $this->height, $color);

}

function setColor($r, $g, $b){

$this->color=imagecolorallocate($this->img, $r, $g, $b);

return (-1 == $this->color) ? (false) : ($this->color);

}

function setTextColor($r, $g, $b){

$this->tcolor=imagecolorallocate($this->img, $r, $g, $b);

return (-1 == $this->tcolor) ? (false) : ($this->tcolor);

}

function setText($t){

$this->text=$t;

}

function waterMark($r, $g, $b, $alpha){

$this->tcolor=imagecolorclosestalpha($this->img, $r, $g, $b, $alpha);

}

function setFontFile($f){

$this->font=$f;

}

function addTrueTypeText($xoffset,$yoffset){

#$x=( ( $this->width - $this->textW - 10) > 0) ? ($this->width - $this->textW - 10) : (0) ;

#$y=( ( $this->height-10) > 0) ? ($this->height-10) : ($this->height);

// 用 TrueType 字体向图像写入文本

// **x,y 坐标是字符串左下角坐标,整幅图像的左上角为 0,0

imagettftext($this->img,

$this->size,

$this->angle,

$xoffset,

$yoffset,

$this->tcolor,

$this->font,

$this->text);

}

function addText() {

// http://www.devdao.com/ 用 color 颜色将字符串 s 画到 image

// **x,y 坐标是字符串左上角坐标,整幅图像的左上角为 0,0

// 如果font 是 1,2,3,4 或 5,则使用内置字体。

imagestring ($this->img, $font, $x, $y, $this->text, $this->tcolor);

}

function setSize($s){

$this->size=$s;

}

function setAngle($a){

$this->angle=$a;

}

function setWidth($w){

$this->width=$w;

}

function setHeight($h){

$this->height=$h;

}

function getWidth(){

return $this->width;

}

function getHeight(){

return $this->height;

}

function setPixel($x,$y,$color){

return imagesetpixel($this->img, $x, $y, $color);

}

function setLine($x1,$y1,$x2,$y2,$color){

return imageline($this->img, $x1, $y1, $x2, $y2, $color);

}

function createImageFile($f="default"){

if( !empty($f) ){

switch($this->type){

case 1:

imagegif($this->img, $f.".gif",80);

break;

case 2:

imagejpeg($this->img, $f.".jpg" , 80);

break;

case 3:

imagepng($this->img, $f.".png", 80);

break;

default:

die("This Image Type Not Support create !");

exit();

}

imagedestroy($this->img);

}

}

function show(){

header("Content-type: ".$this->mime);

switch($this->type){

case 1:

imagegif($this->img);

break;

case 2:

imagejpeg($this->img);

break;

case 3:

imagepng($this->img);

break;

default:

die("This Image Type Not Support show !");

exit();

}

imagedestroy($this->img);

}

/* Zoom Out Picture */

function roomOut($maxW, $maxH){

$WW=(($maxW) and ($this->width > $maxW));

$HH=(($maxH) and ($this->height > $maxH));

if($WW or $HH){

if($WW){

$wRatio =$maxW / $this->width;

$wResize=true;

}

if($HH){

$hRatio =$maxH / $this->height;

$hResize=true;

}

if($wResize and $hResize){

if($wRatio < $hRatio){

$ratio=$wRatio;

}else{

$ratio=$hRatio;

}

}elseif($wResize){

$ratio=$wRatio;

}elseif($hResize){

$ratio=$hRatio;

}

}else{

$ratio=1;

}

$newWidth=$this->width * $ratio;

$newHeight=$this->height * $ratio;

if(function_exists("imagecopyresampled")){

$newimg=imagecreatetruecolor($newWidth, $newHeight);

imagecopyresampled($newimg, $this->img, 0, 0, 0, 0, $newWidth, $newHeight, $this->width, $this->height);

}else{

$newimg=imagecreate($newWidth, $newHeight);

imagecopyresized($newimg, $this->img, 0, 0, 0, 0, $newWidth, $newHeight, $this->width, $this->height);

}

$this->img=$newimg;

$this->width= $newWidth;

$this->height=$newHeight;

}

}

imgverifycode.php

/*

===========================================================

imgverifycode.php  Zhu Weiwei

Copyright © 2006-2008

http://www.cncmm.com China. All Rights Reserved.

===========================================================

*/

$c = ($h + $s)/2;

$o = abs($h-$s-2*$p)/2;

$r = 1;

$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

#$str = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz';

#$str = '0123456789';

$len = strlen($str)-1;

$code = '';

$im = new Image($w,$h);

$im->create();

$im->setBackgroundColor( mt_rand(0xdd,0xff), mt_rand(0xdd,0xff), mt_rand(0xdd,0xff) );

$im->setSize( $s );

for($i=$p; $i  $char = $str{mt_rand(0,$len)};

$code = $code.$char;

$im->setFontFile($CFG->dirroot.'/font/'.mt_rand(2,5).'.ttf');

$im->setText( $char );

$im->setAngle( mt_rand(-$a,$a) );

$im->setTextColor(mt_rand(0x0,0x66),mt_rand(0x0,0x66),mt_rand(0x0,0x66) );

$im->addTrueTypeText($i,mt_rand($c-$o,$c+$o));

for($j=0; $j<8*$r; $j++){

$xs = mt_rand($i-$s/2+$p,$i+$s/2-$p);

$ys = mt_rand($p,$h-$p);

$color = $im->setColor(mt_rand(0x0,0x66),mt_rand(0x0,0x66),mt_rand(0x0,0x66));

$im->setLine( $xs, $ys, $xs+mt_rand(-$s/2,$s/2), $ys+mt_rand(-$s/2,$s/2), $color);

}

}

$SESS = new session();

$SESS->setParameter('verifycode',$code);

for($i=0; $i<200*$r; $i++){

$color = $im->setColor(mt_rand(0x0,0x66),mt_rand(0x0,0x66),mt_rand(0x0,0x66));

$im->setPixel(mt_rand(0,$w), mt_rand(0,$h),$color);

}

$im->show();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值