www.gusucode.com > 3018网博士成品网站管理系统 PHP网站源码程序 > 3018/3018/update/20111209/includes/codeimg.inc.php
<?php header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); //验证码 error_reporting(E_ERROR | E_WARNING | E_PARSE); $verify=new verifyCode; for($i=0;$i<=3;$i++){ $zz=rand(1,9); $code.=$zz; } setCookie("CODEIMG",$code,time()+3600,"/"); //$code=$_COOKIE["CODEIMG"]; $code=strrev($code)+5*2-9; $code=substr ($code,0,4); $verify->vCode($code); $verify->Output(); class verifyCode { var $Noisy = 0; // 干扰点出现的概率 var $Count = 4; // 字符数量 var $Width = 60; // 图片宽度 var $Height = 18; // 图片高度 var $Angle = 0; // 角度随机变化量 var $Offset = 0; // 偏移随机变化量 var $Border = 3; // 边框大小 var $imgData = ""; var $Graph=array(); var $code = ""; function vCode($code) { global $code; $this->code = $code; for($i=0;$i<strlen($code);$i++){ $this->SetDraw(substr($code,$i,1), $i); } } function SetDot($pX, $pY) { if($pX * ($this->Width-$pX-1) >= 0 && $pY * ($this->Height-$pY-1) >= 0) { $this->Graph[$pX][$pY] = 1; } } function Rnd() { mt_srand((double)microtime() * 1000000); return mt_rand(1, 999)/1000; } function Sgn($v) { if($v>0) return 1; if($v==0) return 0; if($v<0) return -1; } function SetDraw($pIndex, $pNumber) { // 字符数据 $DotData[0] = array(10, 1, 80, 1, 80, 100,10,100,10,1); $DotData[1] = array(30, 15, 50, 1, 50, 100); $DotData[2] = array(1 ,34 ,30 ,1 ,71, 1, 100, 34, 1, 100, 93, 100, 100, 86); $DotData[3] = array(1, 1, 100, 1, 42, 42, 100, 70, 50, 100, 1, 70); $DotData[4] = array(100, 73, 6, 73, 75, 6, 75, 100); $DotData[5] = array(100, 1, 1, 1, 1, 50, 50, 35, 100, 55, 100, 80, 50, 100, 1, 95); $DotData[6] = array(100, 20, 70, 1, 20, 1, 1, 30, 1, 80, 30, 100, 70, 100, 100, 80, 100, 60, 70, 50, 30, 50, 1, 60); $DotData[7] = array(6, 26, 6, 6, 100, 6, 53, 100); $DotData[8] = array(100, 30, 100, 20, 70, 1, 30, 1, 1, 20, 1, 30, 100, 70, 100, 80, 70, 100, 30, 100, 1, 80, 1, 70, 100, 30); $DotData[9] = array(1, 80, 30, 100, 80, 100, 100, 70, 100, 20, 70, 1, 30, 1, 1, 20, 1, 40, 30, 50, 70, 50, 100, 40); $vExtent = $this->Width / strlen($this->code); $Margin[0] = $this->Border +$vExtent *$pNumber+ $vExtent * ($this->Rnd() * $this->Offset) / 100; $Margin[1] = $vExtent * ($pNumber + 1) - $this->Border - $vExtent * ($this->Rnd() * $this->Offset) / 100; $Margin[2] = $this->Border + $this->Height * ($this->Rnd() * $this->Offset) / 100; $Margin[3] = $this->Height - $this->Border - $this->Height * ($this->Rnd() * $this->Offset) / 100; $vWidth = intval($Margin[1] - $Margin[0]); $vHeight = intval($Margin[3] - $Margin[2]); //起始坐标 $vStartX = intval(($DotData[$pIndex][0]-1) * $vWidth / 100); $vStartY = intval(($DotData[$pIndex][1]-1) * $vHeight / 100); for ($i = 1 ;$i<=count($DotData[$pIndex])/2;$i++) { If($DotData[$pIndex][2*$i-2] <> 0 && $DotData[$pIndex][2*$i] <> 0) { // 终点坐标 $vEndX = ($DotData[$pIndex][2*$i]-1) * $vWidth / 100; $vEndY = ($DotData[$pIndex][2*$i+1]-1) * $vHeight / 100; // 横向差距 $vDX = $vEndX - $vStartX; // 纵向差距 $vDY = $vEndY - $vStartY; // 倾斜角度 if($vDX == 0) $vAngle = $this->Sgn($vDY) * 3.14/2; else $vAngle = atan($vDY /$vDX); //两坐标距离 if(sin($vAngle) == 0) $vLength = $vDX; else $vLength = $vDY / sin($vAngle); // 随机转动角度 $vAngle = $vAngle + ($this->Rnd() - 0.5) * 2 * $this->Angle * 3.14 * 2 / 100; $vDX = intval(cos($vAngle) * $vLength); $vDY = intval(sin($vAngle) * $vLength); if(abs($vDX) > abs($vDY)) $vDeltaT = abs($vDX) ; else $vDeltaT = abs($vDY); for($j = 1;$j<=$vDeltaT;$j++) $this->SetDot($Margin[0] + $vStartX + $j * $vDX / $vDeltaT, $Margin[2] + $vStartY + $j * $vDY / $vDeltaT); $vStartX = $vStartX + $vDX; $vStartY = $vStartY + $vDY; } } } function Output() { $out = ""; // 文件类型 $out .= "GIF"; // 版本信息 $out .= "89a"; // 逻辑屏幕宽度 $out .= chr($this->Width % 256).chr(($this->Width/256) % 256); // 逻辑屏幕高度 $out .= chr($this->Height % 256).chr(($this->Height / 256) % 256); $out .= chr(128) . chr(0) . chr(0); // 全局颜色列表 $out .= chr(0xEE).chr(0xEE).chr(0xEE); $out .= chr(0x00).chr(0x00).chr(0x00); // 图象标识符 $out .= ","; $out .= chr(0).chr(0).chr(0).chr(0); // 图象宽度 $out .= chr($this->Width % 256).chr(($this->Width/256) % 256); // 图象高度 $out .= chr($this->Height % 256).chr(($this->Height / 256) % 256); $out .= chr(0).chr(7).chr(255); for($y = 0;$y<$this->Height;$y++) { for($x = 0;$x<$this->Width;$x++) { if($this->Rnd() < $this->Noisy / 100) $out .= chr(1-$this->Graph[$x][$y]); else { if($x * ($x-$this->Width) == 0 || $y * ($y-$this->Height) == 0) $out .= chr($this->Graph[$x][$y]); else { if($this->Graph[$x-1][$y]== 1 || $this->Graph[$x][$y] || $this->Graph[$x][$y-1] == 1) $out .= chr(1); else $out .= chr(0); } } if(($y * $this->Width + $x + 1) % 126 == 0) { $out .= chr(128); $i++; } if(($y * $this->Width + $x + $i + 1) % 255 == 0) { if(($this->Width*$this->Height - $y * $this->Width - $x - 1) > 255) $out .= chr(255); else $out .= chr($this->Width * $this->Height %255); } } } $out .= chr(128).chr(0).chr(129).chr(0).chr(59); header("Expires: -9999"); header("Pragma: no-cache"); header("cache-ctrol: no-cache"); header("ContentType: image/gif"); echo $out; } } ?>