<?php
session_start(); 
@header("Expires: -1");
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
//调用:<img src="getyzm.php" alt="看不清楚请点击刷新验证码" class="simg" style="cursor : pointer;" onclick="this.src='getyzm.php';" align="absmiddle">
$seccode = CreateNum(4, 1);
$seccode = sprintf('%04d', $seccode);

function CreateNum($length, $numeric = 0) {
	if ($numeric){
		mt_srand((double)microtime() * 1000000);
		$string = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
	}else{
		srand(date('s'));
		$possible_charactors = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
		$string = '';
		while( strlen($string) < $length ) {
			$string .= substr($possible_charactors,(rand()%(strlen($possible_charactors))),1);
		}
	}
	return($string);
}//CreateNum
//检测是否打开GD库
if(function_exists('imagecreate') && function_exists('imagecolorset') && function_exists('imagecopyresized') && function_exists('imagecolorallocate') && function_exists('imagesetpixel') && function_exists('imagechar') && function_exists('imagepng') && function_exists('imagettftext')) {
	$width = "64";//图片宽
	$height = "20";//图片高
	$len = "4";//生成几位验证码
	$bgcolor = "#ffffff";//背景色
	$noise = true;//生成杂点
	$noisenum = 100;//杂点数量
	$border = false;//边框
	$bordercolor = "#000000";
	$image = imageCreate($width, $height);
	$back = getcolor($bgcolor);
	$code='';
	imageFilledRectangle($image, 0, 0, $width, $height, $back);
	$size = $width/$len;
	if($size>$height) $size=$height;
	$left = ($width-$len*($size+$size/10))/$size;
	for ($i=0; $i<$len; $i++)
	{
        $randtext = $seccode[$i];
        $code .= $randtext;
		$textColor = imageColorAllocate($image, rand(0, 100), rand(0, 100), rand(0, 100));
		$rand = rand(1,4);
		if ($rand < 1 OR $rand > 4) {
			$rand = 1;
		}
		$font = realpath("font/".$rand.".ttf"); 
		$randsize = rand($size-$size/10, $size+$size/10);
		$location = $left+($i*$size+$size/10);
		@imagettftext($image, $randsize, rand(-18,18), $location, rand($size-$size/10, $size+$size/10), $textColor, $font, $randtext); 
	}
	if($noise == true) setnoise();
	$_SESSION["code"] = $code;
	$bordercolor = getcolor($bordercolor); 
	if($border==true) imageRectangle($image, 0, 0, $width-1, $height-1, $bordercolor);
	header("Content-type: image/png");
	imagePng($image);
	imagedestroy($image);
}else{

	$numbers = array
		(
		0 => array('3c','66','66','66','66','66','66','66','66','3c'),
		1 => array('1c','0c','0c','0c','0c','0c','0c','0c','1c','0c'),
		2 => array('7e','60','60','30','18','0c','06','06','66','3c'),
		3 => array('3c','66','06','06','06','1c','06','06','66','3c'),
		4 => array('1e','0c','7e','4c','2c','2c','1c','1c','0c','0c'),
		5 => array('3c','66','06','06','06','7c','60','60','60','7e'),
		6 => array('3c','66','66','66','66','7c','60','60','30','1c'),
		7 => array('30','30','18','18','0c','0c','06','06','66','7e'),
		8 => array('3c','66','66','66','66','3c','66','66','66','3c'),
		9 => array('38','0c','06','06','3e','66','66','66','66','3c')
		);

	for($i = 0; $i < 10; $i++) {
		for($j = 0; $j < 6; $j++) {
			$a1 = substr('012', mt_rand(0, 2), 1).substr('012345', mt_rand(0, 5), 1);
			$a2 = substr('012345', mt_rand(0, 5), 1).substr('0123', mt_rand(0, 3), 1);
			mt_rand(0, 1) == 1 ? array_push($numbers[$i], $a1) : array_unshift($numbers[$i], $a1);
			mt_rand(0, 1) == 0 ? array_push($numbers[$i], $a1) : array_unshift($numbers[$i], $a2);
		}
	}

	$bitmap = array();
	for($i = 0; $i < 20; $i++) {
		for ($j = 0; $j < 4; $j++) {
			$n = substr($seccode, $j, 1);
			$bytes = $numbers[$n][$i];
			$a = mt_rand(0, 14);
			switch($a) {
				case 1: str_replace('9', '8', $bytes); break;
				case 3: str_replace('c', 'e', $bytes); break;
				case 6: str_replace('3', 'b', $bytes); break;
				case 8: str_replace('8', '9', $bytes); break;
				case 0: str_replace('e', 'f', $bytes); break;
			}
			array_push($bitmap, $bytes);
		}
	}

	for ($i = 0; $i < 8; $i++) {
		$a = substr('012', mt_rand(0, 2), 1) . substr('012345', mt_rand(0, 5), 1);
		array_unshift($bitmap, $a);
		array_push($bitmap, $a);
	}

	$image = pack('H*', '424d9e000000000000003e000000280000002000000018000000010001000000'.
			'0000600000000000000000000000000000000000000000000000FFFFFF00'.implode('', $bitmap));

	header('Content-Type: image/bmp');
	echo $image;
}

function getcolor($color)
{
     global $image;
     $color = eregi_replace ("^#","",$color);
     $r = $color[0].$color[1];
     $r = hexdec ($r);
     $b = $color[2].$color[3];
     $b = hexdec ($b);
     $g = $color[4].$color[5];
     $g = hexdec ($g);
     $color = imagecolorallocate ($image, $r, $b, $g); 
     return $color;
}
function setnoise()
{
	global $image, $width, $height, $back, $noisenum;
	for ($i=0; $i<$noisenum; $i++){
		$randColor = imageColorAllocate($image, rand(0, 255), rand(0, 255), rand(0, 255));  
		imageSetPixel($image, rand(0, $width), rand(0, $height), $randColor);
	} 
}
function random($length, $numeric = 0) {
	mt_srand((double)microtime() * 1000000);
	if($numeric) {
		$hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
	} else {
		$hash = '';
		$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
		$max = strlen($chars) - 1;
		for($i = 0; $i < $length; $i++) {
			$hash .= $chars[mt_rand(0, $max)];
		}
	}
	return $hash;
}
?> 