php 中文汉字验证码生成程序
这款关于php 中文汉字验证码生成程序其实很简单的,生成中文汉字验证码需要字体来支持了,下面我们用的arial.ttf来支持生成,否则生成中文图片验证码会出乱码的.
php 中文汉字验证码生成程序代码如下:
<?php class securecode { private static $instance = null; private $code = ''; private $fontfile; private $validate; private $image; private $specialadd = 'special string for securecode'; private $codeexpire = 86400; private $codecookiename = 'secure_code'; /** * 构造方法 */ private function securecode() { $this->fontfile = dirname(__file__) . '/arial.ttf'; } private function __construct() { $this->securecode(); } public static function getinstance() { if (self::$instance == null) self::$instance = new self(); return self::$instance; } /** * 指定字体文件所在路径,默认为当前文件夹下arial.ttf文件 * @param $fontfile 文件路径 * @return void */ function loadfont($fontfile) { $this->fontfile = $fontfile; } /** * 图片输出方法,在执行本方法前程序不应该有任何形式的输出 * @return void; */ function stroke() { $this->savecode(); self::sendheader(); imagegif($this->validate); imagedestroy($this->validate); imagedestroy($this->image); } /** * 图片保存方法 * @param $filename 保存路径 * @return void */ function save($filename) { $this->savecode(); imagegif($this->validate, $filename); imagedestroy($this->validate); imagedestroy($this->image); } /** * 验证码验证方法 * @param $input 要验证的字符串,即用户的输入内容 * @return boolean 验证结果 */ function verify($input) { $input = strtolower($input); $targetcode = $this->authcode($input); $code = $this->getcookie(); if (emptyempty($code) || $code != $targetcode) $result = false; else $result = true; $_cookie[$this->codecookiename] = ''; setcookie($this->codecookiename, '', -1); return $result; } /** * 图片创建方法 * @return void; */ function createimage() { $this->randcode(); $size = 30; $width = 90; $height = 35; $degrees = array( rand(0, 30) , rand(0, 30) , rand(0, 30) , rand(0, 30) ); for ($i = 0; $i < 4; ++$i) { if (rand() % 2); else $degrees[$i] = - $degrees[$i]; } $this->image = imagecreatetruecolor($size, $size); $this->validate = imagecreatetruecolor($width, $height); $back = imagecolorallocate($this->image, 255, 255, 255); $border = imagecolorallocate($this->image, 0, 0, 0); imagefilledrectangle($this->validate, 0, 0, $width, $height, $back); for ($i = 0; $i < 4; ++$i) { $temp = self::rgbtohsv(rand(0, 250) , rand(0, 150) , rand(0, 250)); if ($temp[2] > 60) $temp[2] = 60; $temp = self::hsvtorgb($temp[0], $temp[1], $temp[2]); $textcolor[$i] = imagecolorallocate($this->image, $temp[0], $temp[1], $temp[2]); } for ($i = 0; $i < 200; ++$i) { $randpixelcolor = imagecolorallocate($this->validate, rand(0, 255) , rand(0, 255) , rand(0, 255)); imagesetpixel($this->validate, rand(1, 87) , rand(1, 35) , $randpixelcolor); } $temp = self::rgbtohsv(rand(220, 255) , rand(220, 255) , rand(220, 255)); if ($temp[2] < 200) $temp[2] = 255; $temp = self::hsvtorgb($temp[0], $temp[1], $temp[2]); $randlinecolor = imagecolorallocate($this->image, $temp[0], $temp[1], $temp[2]); self::imagelinethick($this->validate, $textcolor[rand(0, 3) ]); imagefilledrectangle($this->image, 0, 0, $size, $size, $back); putenv('gdfontpath=' . realpath('.')); // name the font to be used (note the lack of the .ttf extension imagettftext($this->image, 15, 0, 8, 20, $textcolor[0], $this->fontfile, $this->code[0]); $this->image = imagerotate($this->image, $degrees[0], $back); imagecolortransparent($this->image, $back); imagecopymerge($this->validate, $this->image, 1, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100); $this->image = imagecreatetruecolor($size, $size); imagefilledrectangle($this->image, 0, 0, $size, $size, $back); imagettftext($this->image, 15, 0, 8, 20, $textcolor[1], $this->fontfile, $this->code[1]); $this->image = imagerotate($this->image, $degrees[1], $back); imagecolortransparent($this->image, $back); imagecopymerge($this->validate, $this->image, 21, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100); $this->image = imagecreatetruecolor($size, $size); imagefilledrectangle($this->image, 0, 0, $size - 1, $size - 1, $back); imagettftext($this->image, 15, 0, 8, 20, $textcolor[2], $this->fontfile, $this->code[2]); $this->image = imagerotate($this->image, $degrees[2], $back); imagecolortransparent($this->image, $back); imagecopymerge($this->validate, $this->image, 41, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100); $this->image = imagecreatetruecolor($size, $size); imagefilledrectangle($this->image, 0, 0, $size - 1, $size - 1, $back); imagettftext($this->image, 15, 0, 8, 20, $textcolor[3], $this->fontfile, $this->code[3]); $this->image = imagerotate($this->image, $degrees[3], $back); imagecolortransparent($this->image, $back); imagecopymerge($this->validate, $this->image, 61, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100); imagerectangle($this->validate, 0, 0, $width - 1, $height - 1, $border); } //开源代码phprm.com /** * 获取随机生成的验证码 * @return string 随机验证码,返回的验证码不进行任何处理 */ function getcode() { return $this->code; } /** * 生成随机码方法 * @return void; */ protected function randcode() { $alphastr = 'abcdefghijklmnpqrstuvwxyz123456789'; $randstr = array( $alphastr{rand(0, 33) }, $alphastr{rand(0, 33) }, $alphastr{rand(0, 33) }, $alphastr{rand(0, 33) } ); $this->code = strtolower($randstr[0] . $randstr[1] . $randstr[2] . $randstr[3]); } /** * rgb色到hsv色转变方法 * @param $r * @param $g * @param $b * @return array hsv数组 */ protected static function rgbtohsv($r, $g, $b) { $tmp = min($r, $g); $min = min($tmp, $b); $tmp = max($r, $g); $max = max($tmp, $b); $v = $max; $delta = $max - $min; if ($max != 0) $s = $delta / $max; // s else { $s = 0; //$h = undefinedcolor; return; } if ($r == $max) $h = ($g - $b) / $delta; // between yellow & magenta else if ($g == $max) $h = 2 + ($b - $r) / $delta; // between cyan & yellow else $h = 4 + ($r - $g) / $delta; // between magenta & cyan $h*= 60; // degrees if ($h < 0) $h+= 360; return array( $h, $s, $v ); } /** * 同上一方法功能相反 * @param $h * @param $s * @param $v * @return array rgb数组 */ protected static function hsvtorgb($h, $s, $v) { if ($s == 0) { // achromatic (grey) $r = $g = $b = $v; return; } $h/= 60; // sector 0 to 5 $i = floor($h); $f = $h - $i; // factorial part of h $p = $v * (1 - $s); $q = $v * (1 - $s * $f); $t = $v * (1 - $s * (1 - $f)); switch ($i) { case 0: $r = $v; $g = $t; $b = $p; break; case 1: $r = $q; $g = $v; $b = $p; break; case 2: $r = $p; $g = $v; $b = $t; break; case 3: $r = $p; $g = $q; $b = $v; break; case 4: $r = $t; $g = $p; $b = $v; break; default: // case 5: $r = $v; $g = $p; $b = $q; break; } return array( $r, $g, $b ); } /** 使用cookie保存验证码的方法 * @return void */ protected function savecode() { $code = $this->authcode($this->code); $this->setcookie($code); } /** * 验证码cookie值获取方法 * @return string cookie值 */ protected function getcookie() { if (emptyempty($_cookie[$this->codecookiename])) { return ''; } else { return addslashes($_cookie[$this->codecookiename]); } } /** * 验证码cookie创建方法 * @param string $code 要保存的验证码 * @return void */ protected function setcookie($code) { $expire = $this->codeexpire > 0 ? $this->codeexpire + time() : 0; setcookie($this->codecookiename, $code, $expire); } /** * 验证码加密方法 * @param string $code 要加密的随机码 * @return mixed 执行结果 */ protected function authcode($code) { return md5($code . $this->specialadd); } /** * 干扰线生成方法 * @param resource $image 图片资源句柄 * @param string $color 干扰线颜色 */ protected static function imagelinethick($image, $color) { $k = rand(5, 20); for ($px = 0; $px < 400; $px = $px + 1) { $y = $k * sin(0.1 * ($px)); //$y=200+10*sin(0.1*($px-200)); for ($i = 0; $i < 2; $i++) { imagesetpixel($image, $px, $y + 10 + $i, $color); } } } /** * http标头设置方法 * @return void */ protected static function sendheader() { header("pragma: no-cache"); header("cache-control: max-age=1, s-maxage=1, no-cache, must-revalidate"); header('content-type: image/gif'); } }
永久链接:http://www.phprm.com/tuxiang/fs4468.html
转载随意!带上文章地址吧。