<?php
//This is a PHP 无组件生成BMP验证码源程序,改自ASP无组件BMP验证码生成程序
// Author: Wilson Chen
// QQ: 36935338
// Email: oeichenwei@yahoo.com
// 通过程序内嵌的"0-9A-Z"的BMP字型库生成真彩色BMP(当然也非常的小)
// 为了尽可能的避免被crack,建议动态改变背景色,下载后适当变换字形库。
// 为了便于处理,验证码的位数必须为偶数位,比如4、6、8....
// 使用的时候把该文件保存为test.php, 引用<img src="test.php" alt="my picture">即可
// Original Author: Layen
// QQ: 84815733
// E-mail: support@ssaw.net
function validation($pSN)
{
// 禁止缓存
header("Expires: -9999");
header("Pragma: no-cache");
header("cache-ctrol: no-cache");
// header("ContentType: Image/BMP");
header("ContentType: Image/BMP");
$cOdds = 8; //杂点出现的机率
$cAmount = 36;//文字数量
$cCode = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 颜色的数据(字符,背景)
$vColorData[0] = "/x0/x0/x0"; //蓝0,绿0,红0(黑色)
$vColorData[1] = "/xfa/xec/xd3"; //蓝250,绿236,红211(浅蓝色)
$num = strlen($pSN);
//随机产生字符
for($i = 0; $i < $num; $i++)
{
$vCode[$i] = strpos($cCode, $pSN{$i});
}
// 字符的数据
$vNumberData[0] = "1110000111110111101111011110111101001011110100101111010010111101001011110111101111011110111110000111";
$vNumberData[1] = "1111011111110001111111110111111111011111111101111111110111111111011111111101111111110111111100000111";
$vNumberData[2] = "1110000111110111101111011110111111111011111111011111111011111111011111111011111111011110111100000011";
$vNumberData[3] = "1110000111110111101111011110111111110111111100111111111101111111111011110111101111011110111110000111";
$vNumberData[4] = "1111101111111110111111110011111110101111110110111111011011111100000011111110111111111011111111000011";
$vNumberData[5] = "1100000011110111111111011111111101000111110011101111111110111111111011110111101111011110111110000111";
$vNumberData[6] = "1111000111111011101111011111111101111111110100011111001110111101111011110111101111011110111110000111";
$vNumberData[7] = "1100000011110111011111011101111111101111111110111111110111111111011111111101111111110111111111011111";
$vNumberData[8] = "1110000111110111101111011110111101111011111000011111101101111101111011110111101111011110111110000111";
$vNumberData[9] = "1110001111110111011111011110111101111011110111001111100010111111111011111111101111011101111110001111";
$vNumberData[10] = "1111011111111101111111101011111110101111111010111111101011111100000111110111011111011101111000100011";
$vNumberData[11] = "1000000111110111101111011110111101110111110000111111011101111101111011110111101111011110111000000111";
$vNumberData[12] = "1110000011110111101110111110111011111111101111111110111111111011111111101111101111011101111110001111";
$vNumberData[13] = "1000001111110111011111011110111101111011110111101111011110111101111011110111101111011101111000001111";
$vNumberData[14] = "1000000111110111101111011011111101101111110000111111011011111101101111110111111111011110111000000111";
$vNumberData[15] = "1000000111110111101111011011111101101111110000111111011011111101101111110111111111011111111000111111";
$vNumberData[16] = "1110000111110111011110111101111011111111101111111110111111111011100011101111011111011101111110001111";
$vNumberData[17] = "1000100011110111011111011101111101110111110000011111011101111101110111110111011111011101111000100011";
$vNumberData[18] = "1100000111111101111111110111111111011111111101111111110111111111011111111101111111110111111100000111";
$vNumberData[19] = "1110000011111110111111111011111111101111111110111111111011111111101111111110111110111011111000011111";
$vNumberData[20] = "1000100011110111011111011011111101011111110001111111010111111101101111110110111111011101111000100011";
$vNumberData[21] = "1000111111110111111111011111111101111111110111111111011111111101111111110111111111011110111000000011";
$vNumberData[22] = "1000100011110010011111001001111100100111110101011111010101111101010111110101011111010101111001010011";
$vNumberData[23] = "1000100011110011011111001101111101010111110101011111010101111101100111110110011111011001111000110111";
$vNumberData[24] = "1110001111110111011110111110111011111011101111101110111110111011111011101111101111011101111110001111";
$vNumberData[25] = "1000000111110111101111011110111101111011110000011111011111111101111111110111111111011111111000111111";
$vNumberData[26] = "1110001111110111011110111110111011111011101111101110111110111011111011101001101111011001111110001011";
$vNumberData[27] = "1000001111110111011111011101111101110111110000111111010111111101101111110110111111011101111000110011";
$vNumberData[28] = "1110000011110111101111011110111101111111111001111111111001111111111011110111101111011110111100000111";
$vNumberData[29] = "1000000011101101101111110111111111011111111101111111110111111111011111111101111111110111111110001111";
$vNumberData[30] = "1000100011110111011111011101111101110111110111011111011101111101110111110111011111011101111110001111";
$vNumberData[31] = "1000100011110111011111011101111101110111111010111111101011111110101111111010111111110111111111011111";
$vNumberData[32] = "1001010011110101011111010101111101010111110101011111001001111110101111111010111111101011111110101111";
$vNumberData[33] = "1000100011110111011111101011111110101111111101111111110111111110101111111010111111011101111000100011";
$vNumberData[34] = "1000100011110111011111011101111110101111111010111111110111111111011111111101111111110111111110001111";
$vNumberData[35] = "1100000011110111011111111101111111101111111110111111110111111111011111111011111111101110111100000011";
// 输出图像文件头
$nFileSize = 54 + $num*300;
print("/x42/x4d".chr(($nFileSize & 0xff)).chr($nFileSize >> 8));
print("/x0/x0/x0/x0/x0/x0/x36/x0/x0/x0/x28/x0/x0/x0".chr($num*10)."/x0/x0/x0/xa/x0/x0/x0/x1/x0");
//输出图像信息头
print("/x18/x0/x0/x0/x0/x0/xb0/x4/x0/x0/x12/xb/x0/x0/x12/xb/x0/x0/x0/x0/x0/x0/x0/x0/x0/x0");
for($i = 9; $i >= 0; $i--) // 历经所有行
{
for($ii = 0; $ii < $num; $ii++) //历经所有字
{
// 逐行、逐字、逐像素地输出图像数据
for($iii = 0; $iii < 10; $iii++) //历经所有像素
{
if(rand(0, 100) < $cOdds)
{
//随机生成杂点
print($vColorData[0]);
}
else
{
print($vColorData[$vNumberData[$vCode[$ii]]{$i * 10 + $iii}]);
}
}
}
}
}
validation("123HEM");
?>