<?php
session_start();
/*
 * 设置部分,此部分可以随意设置
 */
//-------------------------------------------------------------------------
$img_w       = 80;// 设置图片宽
$img_h       = 25;// 设置图片高
$pixel_num   = 200;//点越多干扰越大
$is_set_line = true;// 启用干扰线
$line_mode   = 2;// 干扰线模式,1,删除线;2,交叉线
$pixel_mode  = 2;// 干扰点模式,1,同色;2，杂色
$line_num    = 1;// 交叉线条数(删除线模式下，此设置无效)
//-------------------------------------------------------------------------

// 随机数产生器
function make_seed()
{
    list($usec, $sec) = explode(' ', microtime());
    return (float) $sec + ((float) $usec * 100000);
}
mt_srand(make_seed());//4.2.0以下版本适用
$authnum = mt_rand(100, 99999);

// 加入session
$_SESSION['126cmscode']=$authnum;

//生成验证码图片
Header("Content-type: image/PNG");
$im = imagecreatetruecolor($img_w, $img_h);

$bg_color     = ImageColorAllocate($im, mt_rand(250,255),mt_rand(250,255),mt_rand(250,255));

// 绘制背景
imagefill($im,0,0,$bg_color);

$total_width = 0;
$word_info = array();

// 循环，获取文字信息
$word_length = strlen($authnum);
for($ii=0; $ii<$word_length; $ii++)
{
    $word_space = mt_rand(1,5);
    $font = rand(3,5);
    mt_rand(1,9)%2 == 0?$top = 1:$top = 3;
    $word_info[$ii]['char']   = substr($authnum,$ii,1);
    $word_info[$ii]['font']   = $font;
    $word_info[$ii]['offset'] = $top;
    if($ii == 0)
    {
        $word_info[$ii]['width'] = 0;
    }
    $word_info[$ii]['width']  = imageFontWidth($font)+$word_space;
    $word_info[$ii]['height'] = imageFontHeight($font);
    $word_info[$ii]['color']  = imageColorAllocate($im, mt_rand(0,50),mt_rand(0,150),mt_rand(0,200));

    // 文字总宽度
    $total_width += $word_info[$ii]['width'];

    // 取第一个字体的高度
    if($ii == 0)
    {
        $total_height = imagefontHeight($font);
    }
}

// 计算偏移
$offset_x = floor(($img_w - $total_width)/2);
$offset_y = floor(($img_h - $total_height)/2);

// 填充验证码
$wid = 0;
$i = 0;
foreach($word_info as $key=>$val)
{
    if($i>0)
    {
        $wid += $val['width'];
    }
    imagestring($im, $val['font'], $offset_x + $wid, $val['offset'] + $offset_y,
                $val['char'], $val['color']);
    $i++;
}
switch($pixel_mode)
{
    case 1:
        $pixel_color  = ImageColorAllocate($im,
                                        mt_rand(50,255),
                                        mt_rand(50,255),
                                        mt_rand(50,255));
        // 干扰象素
        for($i=0;$i<$pixel_num;$i++)
        {
            imagesetpixel($im, mt_rand()%$img_w , mt_rand()%$img_h , $pixel_color);
        }
        break;
    case '2':
        // 干扰象素
        for($i=0;$i<$pixel_num;$i++)
        {
            $pixel_color  = ImageColorAllocate($im,
                                        mt_rand(50,255),
                                        mt_rand(50,255),
                                        mt_rand(50,255));
            imagesetpixel($im, mt_rand()%$img_w , mt_rand()%$img_h , $pixel_color);
        }
        break;

    default:
        $pixel_color  = ImageColorAllocate($im,
                                        mt_rand(50,255),
                                        mt_rand(50,255),
                                        mt_rand(50,255));
        // 干扰象素
        for($i=0;$i<$pixel_num;$i++)
        {
            imagesetpixel($im, mt_rand()%$img_w , mt_rand()%$img_h , $pixel_color);
        }
        break;
}

// 干扰线,两种模式,1.删除线，2.交叉线
if(true == $is_set_line)
{
    $per_w = round($img_w/$line_num);
    $per_h = round($img_h/$line_num);
    switch($line_mode)
    {
        case 1:
            $line_color = ImageColorAllocate($im, mt_rand(0,50),mt_rand(0,50),mt_rand(0,50));
            imageline($im, 0, $img_h/2, $img_w, $img_h/2, $line_color);
            break;

        case '2':
            for($j=0; $j<$line_num; $j++)
            {
                // 正向
                $line_color = ImageColorAllocate($im, mt_rand(0,50),mt_rand(0,50),mt_rand(0,50));
                imageline($im, $per_w*($j+1), 0, $img_w, $img_h-$per_h*($j+1), $line_color);
                imageline($im, 0, $per_h*($j+1), $img_w-$per_w*($j+1), $img_h, $line_color);
                imageline($im, $per_w*($j+1), 0, 0, $per_h*($j+1), $line_color);
                imageline($im, $img_w, $per_h*($j+1), $per_w*($j+1), $img_h, $line_color);
            }
            break;

        default:
            $line_color = ImageColorAllocate($im, mt_rand(0,50),mt_rand(0,50),mt_rand(0,50));
            imageline($im, 0, $img_h/2, $img_w, $img_h/2, $line_color);
            break;
    }
}

ImagePNG($im);
ImageDestroy($im);
?>