Discuz6.0 动画验证码

Discuz6.0 动画验证码

好久没上来发贴,呵呵,今天到Discuz论坛上看了一下,发现他的验证码做的不错,就下载下来研究了一下,好像是下载的跟他们本站的有点不同,不过差不多,大家可以到
http://www.discuz.net/register.php 这里看一下效果先。代码如下:
seccode.php

[复制到剪切板]
CODE:
<?php

/*
    [Discuz!] (C)2001-2007 Comsenz Inc.
    This is NOT a freeware, use is subject to license terms

    $Id: seccode.php 9804 2007-08-15 05:56:19Z cnteacher $
*/
error_reporting(0);
set_magic_quotes_runtime(0);
session_start();
foreach(array(
'_COOKIE''_POST''_GET') as $_request) {
    foreach($
$_request as $_key => $_value) {
        
$_key{0} != '_' && $$_key daddslashes($_value);
    }
}
$_DCACHE['settings'] = array (
  
'seccodedata' => 
      array (
        
'minposts' => '',
        
'loginfailedcount' => 0,
        
'width' => 150,
        
'height' => 60,
        
'type' => '0',
        
'background' => '1',
        
'adulterate' => '1',
        
'ttf' => '0',
        
'angle' => '0',
        
'color' => '1',
        
'size' => '0',
        
'shadow' => '1',
        
'animator' => '1',
      ),
);
@
extract($_DCACHE['settings']);
function 
daddslashes($string$force 0) {
    !
defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC'get_magic_quotes_gpc());
    if(!
MAGIC_QUOTES_GPC || $force) {
        if(
is_array($string)) {
            foreach(
$string as $key => $val) {
                
$string[$key] = daddslashes($val$force);
            }
        } else {
            
$string addslashes($string);
        }
    }
    return 
$string;
}
function 
dheader($string$replace true$http_response_code 0) {
    
$string str_replace(array("\r""\n"), array(''''), $string);
    if(empty(
$http_response_code) || PHP_VERSION '4.3' ) {
        @
header($string$replace);
    } else {
        @
header($string$replace$http_response_code);
    }
    if(
preg_match('/^\s*location:/is'$string)) {
        exit();
    }
}
function 
random($length$numeric 0) {
    
PHP_VERSION '4.2.0' && mt_srand((double)microtime() * 1000000);
    if(
$numeric) {
        
$hash sprintf('%0'.$length.'d'mt_rand(0pow(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;
}
function 
seccodeconvert(&$seccode) {
    global 
$seccodedata$charset;
    
$seccode substr($seccode, -6);
    if(
$seccodedata['type'] == 1) {
        
$len strtoupper($charset) == 'GBK' 3;
        
$code = array(substr($seccode03), substr($seccode33));
        
$seccode '';
        for(
$i 0$i 2$i++) {
            
$seccode .= substr($lang['chn'], $code[$i] * $len$len);
        }
    } else {
        
$s sprintf('%04s'base_convert($seccode1024));
        
$seccode '';
        
$seccodeunits 'BCEFGHJKMPQRTVWXY2346789';
        for(
$i 0$i 4$i++) {
            
$unit ord($s{$i});
            
$seccode .= ($unit >= 0x30 && $unit <= 0x39) ? $seccodeunits[$unit 0x30] : $seccodeunits[$unit 0x57];
        }
    }
}
 
$refererhost parse_url($_SERVER['HTTP_REFERER']);
$refererhost['host'] .= !empty($refererhost['port']) ? (':'.$refererhost['port']) : '';


$seccodedata['width'] = $seccodedata['width'] >= 100 && $seccodedata['width'] <= 200 $seccodedata['width'] : 150;
$seccodedata['height'] = $seccodedata['height'] >= 50 && $seccodedata['height'] <= 80 $seccodedata['height'] : 60;

if(
$update) {
    
$seccode random(61) + $seccode{0} * 1000000;
}
seccodeconvert($seccode);
$_SESSION["seccode"] = $seccode;

if(!
$nocacheheaders) {
    @
dheader("Expires: -1");
    @
dheader("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0"FALSE);
    @
dheader("Pragma: no-cache");
}

if(
$seccodedata['type'] < && function_exists('imagecreate') && function_exists('imagecolorset') && function_exists('imagecopyresized') &&
    
function_exists('imagecolorallocate') && function_exists('imagechar') && function_exists('imagecolorsforindex') &&
    
function_exists('imageline') && function_exists('imagecreatefromstring') && (function_exists('imagegif') || function_exists('imagepng') || function_exists('imagejpeg'))) {

    
$bgcontent seccode_background();

    if(
$seccodedata['animator'] == && function_exists('imagegif')) {

        include_once 
'./gifmerge.class.php';
        
$trueframe mt_rand(19);

        for(
$i 0$i <= 9$i++) {
            
$im imagecreatefromstring($bgcontent);
            
$x[$i] = $y[$i] = 0;
            
$seccodedata['adulterate'] && seccode_adulterate();
            if(
$i == $trueframe) {
                
$seccodedata['ttf'] && function_exists('imagettftext') || $seccodedata['type'] == seccode_ttffont() : seccode_giffont();
                
$d[$i] = mt_rand(250400);
            } else {
                
seccode_adulteratefont();
                
$d[$i] = mt_rand(515);
            }
            
ob_start();
            
imagegif($im);
            
imagedestroy($im);
            
$frame[$i] = ob_get_contents();
            
ob_end_clean();
        }
        
$anim = new GifMerge($frame2552552550$d$x$y'C_MEMORY');
        
dheader('Content-type: image/gif');
        echo 
$anim->getAnimation();

    } else {

        
$im imagecreatefromstring($bgcontent);
        
$seccodedata['adulterate'] && seccode_adulterate();
        
$seccodedata['ttf'] && function_exists('imagettftext') || $seccodedata['type'] == seccode_ttffont() : seccode_giffont();

        if(
function_exists('imagepng')) {
            
dheader('Content-type: image/png');
            
imagepng($im);
        } else {
            
dheader('Content-type: image/jpeg');
            
imagejpeg($im''100);
        }
        
imagedestroy($im);

    }

} elseif(
$seccodedata['type'] == && extension_loaded('ming')) {

    
$spacing 5;
    
$codewidth = ($seccodedata['width'] - $spacing 5) / 4;
    
$strforswdaction '';
    for(
$i 0$i <= 3$i++) {
        
$strforswdaction .= seccode_swfcode($codewidth$spacing$seccode[$i], $i+1);
    }

    
ming_setScale(20.00000000);
    
ming_useswfversion(6);
    
$movie = new SWFMovie();
    
$movie->setDimension($seccodedata['width'], $seccodedata['height']);
    
$movie->setBackground(255255255);
    
$movie->setRate(31);

    
$fontcolor '0x'.(sprintf('%02s'dechex (mt_rand(0255)))).(sprintf('%02s'dechex (mt_rand(0128)))).(sprintf('%02s'dechex (mt_rand(0255))));
    
$strAction "
    _root.createEmptyMovieClip ( 'triangle', 1 );
    with ( _root.triangle ) {
    lineStyle( 3, 
$fontcolor, 100 );
    
$strforswdaction
    }
    "
;
    
$movie->add(new SWFActionstr_replace("\r"""$strAction) ));
    
header('Content-type: application/x-shockwave-flash');
    
$movie->output();

} else {

    
$numbers = array
        (
        
'B' => array('00','fc','66','66','66','7c','66','66','fc','00'),
        
'C' => array('00','38','64','c0','c0','c0','c4','64','3c','00'),
        
'E' => array('00','fe','62','62','68','78','6a','62','fe','00'),
        
'F' => array('00','f8','60','60','68','78','6a','62','fe','00'),
        
'G' => array('00','78','cc','cc','de','c0','c4','c4','7c','00'),
        
'H' => array('00','e7','66','66','66','7e','66','66','e7','00'),
        
'J' => array('00','f8','cc','cc','cc','0c','0c','0c','7f','00'),
        
'K' => array('00','f3','66','66','7c','78','6c','66','f7','00'),
        
'M' => array('00','f7','63','6b','6b','77','77','77','e3','00'),
        
'P' => array('00','f8','60','60','7c','66','66','66','fc','00'),
        
'Q' => array('00','78','cc','cc','cc','cc','cc','cc','78','00'),
        
'R' => array('00','f3','66','6c','7c','66','66','66','fc','00'),
        
'T' => array('00','78','30','30','30','30','b4','b4','fc','00'),
        
'V' => array('00','1c','1c','36','36','36','63','63','f7','00'),
        
'W' => array('00','36','36','36','77','7f','6b','63','f7','00'),
        
'X' => array('00','f7','66','3c','18','18','3c','66','ef','00'),
        
'Y' => array('00','7e','18','18','18','3c','24','66','ef','00'),
        
'2' => array('fc','c0','60','30','18','0c','cc','cc','78','00'),
        
'3' => array('78','8c','0c','0c','38','0c','0c','8c','78','00'),
        
'4' => array('00','3e','0c','fe','4c','6c','2c','3c','1c','1c'),
        
'6' => array('78','cc','cc','cc','ec','d8','c0','60','3c','00'),
        
'7' => array('30','30','38','18','18','18','1c','8c','fc','00'),
        
'8' => array('78','cc','cc','cc','78','cc','cc','cc','78','00'),
        
'9' => array('f0','18','0c','6c','dc','cc','cc','cc','78','00')
        );

    foreach(
$numbers as $i => $number) {
        for(
$j 0$j 6$j++) {
            
$a1 substr('012'mt_rand(02), 1).substr('012345'mt_rand(05), 1);
            
$a2 substr('012345'mt_rand(05), 1).substr('0123'mt_rand(03), 1);
            
mt_rand(01) == array_push($numbers[$i], $a1) : array_unshift($numbers[$i], $a1);
            
mt_rand(01) == 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$j1);
            
$bytes $numbers[$n][$i];
            
$a mt_rand(014);
            
array_push($bitmap$bytes);
        }
    }

    for(
$i 0$i 8$i++) {
        
$a substr('012345'mt_rand(02), 1) . substr('012345'mt_rand(05), 1);
        
array_unshift($bitmap$a);
        
array_push($bitmap$a);
    }

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

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

}

function 
seccode_background() {
    global 
$seccodedata$c;
    
$im imagecreatetruecolor($seccodedata['width'], $seccodedata['height']);
    
$backgroundcolor imagecolorallocate($im255255255);
    
$backgrounds = array();
    if(
$seccodedata['background'] && function_exists('imagecreatefromjpeg') && function_exists('imagecolorat') &&    function_exists('imagecopymerge') &&
        
function_exists('imagesetpixel') && function_exists('imageSX') && function_exists('imageSY')) {
        if(
$handle = @opendir('images/seccode/background/')) {
            while(
$bgfile = @readdir($handle)) {
                if(
preg_match('/\.jpg$/i'$bgfile)) {
                    
$backgrounds[] = 'images/seccode/background/'.$bgfile;
                }
            }
            @
closedir($handle);
        }
        if(
$backgrounds) {
            
$imwm imagecreatefromjpeg($backgrounds[array_rand($backgrounds)]);
            
$colorindex imagecolorat($imwm00);
            
$c imagecolorsforindex($imwm$colorindex);
            
$colorindex imagecolorat($imwm10);
            
imagesetpixel($imwm00$colorindex);
            
$c[0] = $c['red'];$c[1] = $c['green'];$c[2] = $c['blue'];
            
imagecopymerge($im$imwm00mt_rand(0200 $seccodedata['width']), mt_rand(080 $seccodedata['height']), imageSX($imwm), imageSY($imwm), 100);
            
imagedestroy($imwm);
        }
    }
    if(!
$seccodedata['background'] || !$backgrounds) {
        for(
$i 0;$i 3;$i++) {
            
$start[$i] = mt_rand(200255);$end[$i] = mt_rand(100150);$step[$i] = ($end[$i] - $start[$i]) / $seccodedata['width'];$c[$i] = $start[$i];
        }
        for(
$i 0;$i $seccodedata['width'];$i++) {
            
$color imagecolorallocate($im$c[0], $c[1], $c[2]);
            
imageline($im$i0$i-$angle$seccodedata['height'], $color);
            
$c[0] += $step[0];$c[1] += $step[1];$c[2] += $step[2];
        }
        
$c[0] -= 20;$c[1] -= 20;$c[2] -= 20;
    }
    
ob_start();
    if(
function_exists('imagepng')) {
        
imagepng($im);
    } else {
        
imagejpeg($im''100);
    }
    
imagedestroy($im);
    
$bgcontent ob_get_contents();
    
ob_end_clean();
    return 
$bgcontent;
}

function 
seccode_giffont() {
    global 
$seccode$seccodedata$im$c;
    
$seccodedir = array();
    if(
function_exists('imagecreatefromgif')) {
        
$seccoderoot 'images/seccode/gif/';
        
$dirs opendir($seccoderoot);
        while(
$dir readdir($dirs)) {
            if(
$dir != '.' && $dir != '..' && file_exists($seccoderoot.$dir.'/9.gif')) {
                
$seccodedir[] = $dir;
            }
        }
    }
    
$widthtotal 0;
    for(
$i 0$i <= 3$i++) {
        
$imcodefile $seccodedir $seccoderoot.$seccodedir[array_rand($seccodedir)].'/'.strtolower($seccode[$i]).'.gif' '';
        if(!empty(
$imcodefile) && file_exists($imcodefile)) {
            
$font[$i]['file'] = $imcodefile;
            
$font[$i]['data'] = getimagesize($imcodefile);
            
$font[$i]['width'] = $font[$i]['data'][0] + mt_rand(06) - 4;
            
$font[$i]['height'] = $font[$i]['data'][1] + mt_rand(06) - 4;
            
$font[$i]['width'] += mt_rand(0$seccodedata['width'] / $font[$i]['width']);
            
$widthtotal += $font[$i]['width'];
        } else {
            
$font[$i]['file'] = '';
            
$font[$i]['width'] = mt_rand(0$seccodedata['width'] / 5);
            
$widthtotal += $font[$i]['width'];
        }
    }
    
$x mt_rand(1$seccodedata['width'] - $widthtotal);
    for(
$i 0$i <= 3$i++) {
        
$seccodedata['color'] && $c = array(mt_rand(0255), mt_rand(0255), mt_rand(0255));
        if(
$font[$i]['file']) {
            
$imcode imagecreatefromgif($font[$i]['file']);
            if(
$seccodedata['size']) {
                
$font[$i]['width'] = mt_rand($font[$i]['width'] - $seccodedata['width'] / 20$font[$i]['width'] + $seccodedata['width'] / 20);
                
$font[$i]['height'] = mt_rand($font[$i]['height'] - $seccodedata['width'] / 20$font[$i]['height'] + $seccodedata['width'] / 20);
            }
            
$y mt_rand(0$seccodedata['height'] - $font[$i]['height']);
            if(
$seccodedata['shadow']) {
                
$imcodeshadow $imcode;
                
imagecolorset($imcodeshadow255 $c[0], 255 $c[1], 255 $c[2]);
                
imagecopyresized($im$imcodeshadow$x 1$y 100$font[$i]['width'], $font[$i]['height'], $font[$i]['data'][0], $font[$i]['data'][1]);
            }
            
imagecolorset($imcode$c[0], $c[1], $c[2]);
            
imagecopyresized($im$imcode$x$y00$font[$i]['width'], $font[$i]['height'], $font[$i]['data'][0], $font[$i]['data'][1]);
        } else {
            
$y mt_rand(0$seccodedata['height'] - 20);
            if(
$seccodedata['shadow']) {
                
$text_shadowcolor imagecolorallocate($im255 $c[0], 255 $c[1], 255 $c[2]);
                
imagechar($im5$x 1$y 1$seccode[$i], $text_shadowcolor);
            }
            
$text_color imagecolorallocate($im$c[0], $c[1], $c[2]);
            
imagechar($im5$x$y$seccode[$i], $text_color);
        }
        
$x += $font[$i]['width'];
    }
}

function 
seccode_ttffont() {
    global 
$seccode$seccodedata$im$c$charset;
    
$seccoderoot $seccodedata['type'] ? 'images/fonts/ch/' 'images/fonts/en/';
    
$dirs opendir($seccoderoot);
    
$seccodettf = array();
    while(
$entry readdir($dirs)) {
        if(
$entry != '.' && $entry != '..' && strtolower(fileext($entry)) == 'ttf') {
            
$seccodettf[] = $entry;
        }
    }
    
$seccodelength 4;
    if(
$seccodedata['type'] && !empty($seccodettf)) {
        if(
strtoupper($charset) != 'UTF-8') {
            include 
DISCUZ_ROOT.'include/chinese.class.php';
            
$cvt = new Chinese($charset'utf8');
            
$seccode $cvt->Convert($seccode);
        }
        
$seccode = array(substr($seccode03), substr($seccode33));
        
$seccodelength 2;
    }
    
$widthtotal 0;
    for(
$i 0$i $seccodelength$i++) {
        
$font[$i]['font'] = $seccoderoot.$seccodettf[array_rand($seccodettf)];
        
$font[$i]['angle'] = $seccodedata['angle'] ? mt_rand(-3030) : 0;
        
$font[$i]['size'] = $seccodedata['type'] ? $seccodedata['width'] / $seccodedata['width'] / 6;
        
$seccodedata['size'] && $font[$i]['size'] = mt_rand($font[$i]['size'] - $seccodedata['width'] / 40$font[$i]['size'] + $seccodedata['width'] / 20);
        
$box imagettfbbox($font[$i]['size'], 0$font[$i]['font'], $seccode[$i]);
        
$font[$i]['zheight'] = max($box[1], $box[3]) - min($box[5], $box[7]);
        
$box imagettfbbox($font[$i]['size'], $font[$i]['angle'], $font[$i]['font'], $seccode[$i]);
        
$font[$i]['height'] = max($box[1], $box[3]) - min($box[5], $box[7]);
        
$font[$i]['hd'] = $font[$i]['height'] - $font[$i]['zheight'];
        
$font[$i]['width'] = (max($box[2], $box[4]) - min($box[0], $box[6])) + mt_rand(0$seccodedata['width'] / 8);
        
$font[$i]['width'] = $font[$i]['width'] > $seccodedata['width'] / $seccodelength $seccodedata['width'] / $seccodelength $font[$i]['width'];
        
$widthtotal += $font[$i]['width'];
    }
    
$x mt_rand($font[0]['angle'] > cos(deg2rad(90 $font[0]['angle'])) * $font[0]['zheight'] : 1$seccodedata['width'] - $widthtotal);
    !
$seccodedata['color'] && $text_color imagecolorallocate($im$c[0], $c[1], $c[2]);
    for(
$i 0$i $seccodelength$i++) {
        if(
$seccodedata['color']) {
            
$c = array(mt_rand(0255), mt_rand(0255), mt_rand(0255));
            
$seccodedata['shadow'] && $text_shadowcolor imagecolorallocate($im255 $c[0], 255 $c[1], 255 $c[2]);
            
$text_color imagecolorallocate($im$c[0], $c[1], $c[2]);
        } elseif(
$seccodedata['shadow']) {
            
$text_shadowcolor imagecolorallocate($im255 $c[0], 255 $c[1], 255 $c[2]);
        }
        
$y $font[0]['angle'] > mt_rand($font[$i]['height'], $seccodedata['height']) : mt_rand($font[$i]['height'] - $font[$i]['hd'], $seccodedata['height'] - $font[$i]['hd']);
        
$seccodedata['shadow'] && imagettftext($im$font[$i]['size'], $font[$i]['angle'], $x 1$y 1$text_shadowcolor$font[$i]['font'], $seccode[$i]);
        
imagettftext($im$font[$i]['size'], $font[$i]['angle'], $x$y$text_color$font[$i]['font'], $seccode[$i]);
        
$x += $font[$i]['width'];
    }
}

function 
seccode_adulterate() {
    global 
$seccodedata$im$c;
    
$linenums $seccodedata['height'] / 10;
    for(
$i=0$i <= $linenums$i++) {
        
$color $seccodedata['color'] ? imagecolorallocate($immt_rand(0255), mt_rand(0255), mt_rand(0255)) : imagecolorallocate($im$c[0], $c[1], $c[2]);
        
$x mt_rand(0$seccodedata['width']);
        
$y mt_rand(0$seccodedata['height']);
        if(
mt_rand(01)) {
            
imagearc($im$x$ymt_rand(0$seccodedata['width']), mt_rand(0$seccodedata['height']), mt_rand(0360), mt_rand(0360), $color);
        } else {
            
imageline($im$x$y$linex mt_rand(0$linemaxlong), $liney mt_rand(0mt_rand($seccodedata['height'], $seccodedata['width'])), $color);
        }
    }
}

function 
seccode_adulteratefont() {
    global 
$seccodedata$im$c;
    
$seccodeunits 'BCEFGHJKMPQRTVWXY2346789';
    
$x $seccodedata['width'] / 4;
    
$y $seccodedata['height'] / 10;
    
$text_color imagecolorallocate($im$c[0], $c[1], $c[2]);
    for(
$i 0$i <= 3$i++) {
        
$adulteratecode $seccodeunits[mt_rand(023)];
        
imagechar($im5$x $i mt_rand(0$x 10), mt_rand($y$seccodedata['height'] - 10 $y), $adulteratecode$text_color);
    }
}

function 
seccode_swfcode($width$d$code$order) {
    global 
$seccodedata;
    
$str '';
    
$height $seccodedata['height'] - $d 2;
    
$x_0 = ($order * ($width $d) - $width);
    
$x_1 $x_0 $width 2;
    
$x_2 $x_0 $width;
    
$y_0 $d;
    
$y_2 $y_0 $height;
    
$y_1 $y_2 2;
    
$y_0_5 $y_2 4;
    
$y_1_5 $y_1 $y_0_5;
    switch(
$code) {
        case 
'B':$str .= 'moveTo('.$x_1.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_1.', '.$y_2.');lineTo('.$x_2.', '.$y_1_5.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_0_5.');lineTo('.$x_1.', '.$y_0.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
        case 
'C':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');';break;
        case 
'E':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
        case 
'F':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
        case 
'G':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_2.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');';break;
        case 
'H':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');moveTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_2.', '.$y_1.');';break;
        case 
'J':$str .= 'moveTo('.$x_1.', '.$y_0.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_0.', '.$y_1_5.');';break;
        case 
'K':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_0.', '.$y_1.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');moveTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_2.');';break;
        case 
'M':$str .= 'moveTo('.$x_0.', '.$y_2.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');';break;
        case 
'P':$str .= 'moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_0_5.');lineTo('.$x_1.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');';break;
        case 
'Q':$str .= 'moveTo('.$x_2.', '.$y_2.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_1.', '.$y_1.');';break;
        case 
'R':$str .= 'moveTo('.$x_0.', '.$y_1.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_0_5.');lineTo('.$x_1.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');moveTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_2.');';break;
        case 
'T':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_2.', '.$y_0.');moveTo('.$x_1.', '.$y_0.');lineTo('.$x_1.', '.$y_2.');';break;
        case 
'V':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_1.', '.$y_2.');lineTo('.$x_2.', '.$y_0.');';break;
        case 
'W':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_2.', '.$y_0.');';break;
        case 
'X':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');';break;
        case 
'Y':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_1.', '.$y_1.');lineTo('.$x_2.', '.$y_0.');moveTo('.$x_1.', '.$y_1.');lineTo('.$x_1.', '.$y_2.');';break;
        case 
'2':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_1.');lineTo('.$x_0.', '.$y_1.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');';break;
        case 
'3':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_0.', '.$y_2.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_2.', '.$y_1.');';break;
        case 
'4':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');moveTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_1.');lineTo('.$x_2.', '.$y_1.');';break;
        case 
'6':$str .= 'moveTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_2.', '.$y_1.');lineTo('.$x_0.', '.$y_1.');';break;
        case 
'7':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');';break;
        case 
'8':$str .= 'moveTo('.$x_0.', '.$y_0.');lineTo('.$x_0.', '.$y_2.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_0.', '.$y_0.');moveTo('.$x_0.', '.$y_1.');lineTo('.$x_2.', '.$y_1.');';break;
        case 
'9':$str .= 'moveTo('.$x_2.', '.$y_1.');lineTo('.$x_0.', '.$y_1.');lineTo('.$x_0.', '.$y_0.');lineTo('.$x_2.', '.$y_0.');lineTo('.$x_2.', '.$y_2.');lineTo('.$x_0.', '.$y_2.');';break;
    }
    return 
$str;
}
?> ;


gifmerge.class.php

[复制到剪切板]
CODE:
<?php

 

class GifMerge {
    var 
$ver            '1.1';
    var 
$dly            50;
    var 
$mod            'C_FILE';
    var 
$first            true;
    var 
$use_loop            false;
    var 
$transparent        false;
    var 
$use_global_in        false;
    var 
$x                0;
    var 
$y                0;
    var 
$ch                0;
    var 
$fin            0;
    var 
$fout            '';
    var 
$loop            0;
    var 
$delay            0;
    var 
$width            0;
    var 
$height            0;
    var 
$trans1             255;
    var 
$trans2             255;
    var 
$trans3             255;
    var 
$disposal            2;
    var 
$out_color_table_size    0;
    var 
$local_color_table_flag    0;
    var 
$global_color_table_size    0;
    var 
$out_color_table_sizecode    0;
    var 
$global_color_table_sizecode0;
    var 
$gif            = array(0x470x490x46);
    var 
$buffer            = array();
    var 
$local_in            = array();
    var 
$global_in            = array();
    var 
$global_out            = array();
    var 
$logical_screen_descriptor    = array();

    function 
GifMerge($images$t1$t2$t3$loop$dl$xpos$ypos$model) {
        if(
$model) {
            
$this->mod $model;
        }
        if(
$loop > -1) {
            
$this->loop floor($loop 1);
            
$this->use_loop true;
        }
        if(
$t1 > -&& $t2 > -&& $t3 > -1) {
            
$this->trans1 $t1;
            
$this->trans2 $t2;
            
$this->trans3 $t3;
            
$this->transparent true;
        }
        for(
$i 0$i count($images); $i++) {
            
$dl[$i]    ? $this->delay $dl[$i] : $this->delay $this->dly;
            
$xpos[$i] ? $this->$xpos[$i] : $this->0;
            
$ypos[$i] ? $this->$ypos[$i] : $this->0;
            
$this->start_gifmerge_process($images[$i]);
        }
        
$this->fout .= "\x3b";
    }

    function 
start_gifmerge_process($fp) {
        if(
$this->mod == 'C_FILE') {
            if(!
$this->fin fopen($fp'rb')) {
                return;
            }
        } elseif(
$this->mod == 'C_MEMORY') {
            
$this->ch 0;
            
$this->fin $fp;
        }
        
$this->getbytes(6);
        if(!
$this->arrcmp($this->buffer$this->gif3)) {
            return;
        }
        
$this->getbytes(7);
        if(
$this->first$this->logical_screen_descriptor $this->buffer;
        
$this->global_color_table_sizecode $this->buffer[4] & 0x07;
        
$this->global_color_table_size << $this->global_color_table_sizecode;
        if(
$this->buffer[4] & 0x80) {
            
$this->getbytes(($this->global_color_table_size));
            for(
$i 0$i < (($this->global_color_table_size)); $i++) {
                
$this->global_in[$i] = $this->buffer[$i];
            }
            if(
$this->out_color_table_size == 0) {
                
$this->out_color_table_size $this->global_color_table_size;
                
$out_color_table_sizecode $this->global_color_table_sizecode;
                
$this->global_out $this->global_in;
            }
            if(
$this->global_color_table_size != $this->out_color_table_size || $this->arrcmp($this->global_out$this->global_in, ($this->global_color_table_size))) {
                
$this->use_global_in true;
            }
        }
        for(
$loop true$loop;) {
            
$this->getbytes(1);
            switch(
$this->buffer[0]) {
                case 
0x21:
                    
$this->read_extension();
                    break;
                case 
0x2c:
                    
$this->read_image_descriptor();
                    break;
                case 
0x3b:
                    
$loop false;
                break;
                default:
                    
$loop false;
            }
        }
        if(
$this->mod == 'C_FILE') {
            
fclose($this->fin);
        }
    }

    function 
read_image_descriptor() {
        
$this->getbytes(9);
        
$head $this->buffer;
            
$this->local_color_table_flag = ($this->buffer[8] & 0x80) ? true false;
            if(
$this->local_color_table_flag) {
            
$sizecode $this->buffer[8] & 0x07;
            
$size << $sizecode;
            
$this->getbytes($size);
            for(
$i 0$i < ($size); $i++) {
                    
$this->local_in[$i] = $this->buffer[$i];
                }
                if(
$this->out_color_table_size == 0) {
                    
$this->out_color_table_size $size;
                    
$out_color_table_sizecode $sizecode;
                for(
$i 0$i < ($size); $i++)
                {
                    
$this->global_out[$i] = $this->local_in[$i];
                }
                }
            }
            if(
$this->first) {
            
$this->first false;
            
$this->fout .= "\x47\x49\x46\x38\x39\x61";
            if(
$this->width && $this->height) {
                
$this->logical_screen_descriptor[0] = $this->width 0xFF;
                
$this->logical_screen_descriptor[1] = ($this->width 0xFF00) >> 8;
                
$this->logical_screen_descriptor[2] = $this->height 0xFF;
                
$this->logical_screen_descriptor[3] = ($this->height 0xFF00) >> 8;
            }
            
$this->logical_screen_descriptor[4] |= 0x80;
            
$this->logical_screen_descriptor[5] &= 0xF0;
            
$this->logical_screen_descriptor[6] |= $this->out_color_table_sizecode;
            
$this->putbytes($this->logical_screen_descriptor7);
                
$this->putbytes($this->global_out, ($this->out_color_table_size 3));
            if(
$this->use_loop) {
                
$ns[0] = 0x21;
                
$ns[1] = 0xFF;
                
$ns[2] = 0x0B;
                
$ns[3] = 0x4e;
                
$ns[4] = 0x45;
                
$ns[5] = 0x54;
                
$ns[6] = 0x53;
                
$ns[7] = 0x43;
                
$ns[8] = 0x41;
                
$ns[9] = 0x50;
                
$ns[10] = 0x45;
                
$ns[11] = 0x32;
                
$ns[12] = 0x2e;
                
$ns[13] = 0x30;
                
$ns[14] = 0x03;
                
$ns[15] = 0x01;
                
$ns[16] = $this->loop 255;
                    
$ns[17] = $this->loop >> 8;
                
$ns[18] = 0x00;
                
$this->putbytes($ns19);
            }
            }
          if(
$this->use_global_in) {
            
$outtable $this->global_in;
            
$outsize $this->global_color_table_size;
            
$outsizecode $this->global_color_table_sizecode;
        } else {
            
$outtable $this->global_out;
            
$outsize $this->out_color_table_size;
        }
        if(
$this->local_color_table_flag) {
            if(
$size == $this->out_color_table_size && !$this->arrcmp($this->local_in$this->global_out$size)) {
                
$outtable $global_out;
                
$outsize $this->out_color_table_size;
            } else {
                
$outtable $this->local_in;
                
$outsize $size;
                
$outsizecode $sizecode;
            }
        }
        
$use_trans false;
        if(
$this->transparent) {
            for(
$i 0$i $outsize$i++) {
                if(
$outtable[$i] == $this->trans1 && $outtable [$i 1] == $this->trans2 && $outtable [$i 2] == $this->trans3) {
                    break;
                }
            }
            if(
$i $outsize) {
                
$transindex $i;
                
$use_trans true;
            }
        }
        if(
$this->delay || $use_trans) {
            
$this->buffer[0] = 0x21;
            
$this->buffer[1] = 0xf9;
            
$this->buffer[2] = 0x04;
            
$this->buffer[3] = ($this->disposal << 2) + ($use_trans 0);
            
$this->buffer[4] = $this->delay 0xff;
            
$this->buffer[5] = ($this->delay 0xff00) >> 8;
            
$this->buffer[6] = $use_trans $transindex 0;
            
$this->buffer[7] = 0x00;
            
$this->putbytes($this->buffer,8);
        }
        
$this->buffer[0] = 0x2c;
        
$this->putbytes($this->buffer,1);
        
$head[0] = $this->0xff;
        
$head[1] = ($this->0xff00) >> 8;
        
$head[2] = $this->0xff;
        
$head[3] = ($this->0xff00) >> 8;
        
$head[8] &= 0x40;
        if(
$outtable != $this->global_out) {
            
$head[8] |= 0x80;
            
$head[8] |= $outsizecode;
        }
        
$this->putbytes($head,9);
        if(
$outtable != $this->global_out) {
            
$this->putbytes($outtable, ($outsize));
        }
        
$this->getbytes(1);
        
$this->putbytes($this->buffer,1);
        for(;;) {
            
$this->getbytes(1);
            
$this->putbytes($this->buffer,1);
            if((
$u $this->buffer[0]) == 0) {
                break;
            }
            
$this->getbytes($u);
            
$this->putbytes($this->buffer$u);
            }
    }

    function 
read_extension() {
        
$this->getbytes(1);
        switch(
$this->buffer[0]) {
            case 
0xf9:
                    
$this->getbytes(6);
                   break;
            case 
0xfe:
                    for(;;) {
                    
$this->getbytes(1);
                            if((
$u $this->buffer[0]) == 0) {
                            break;
                        }
                    
$this->getbytes($u);
                    }
                break;
            case 
0x01:
                    
$this->getbytes(13);
                    for(;;) {
                    
$this->getbytes(0);
                            if((
$u $this->buffer[0]) == 0) {
                            break;
                        }
                    
$this->getbytes($u);
                    }
                break;
                   case 
0xff:
                    
$this->getbytes(9);
                    
$this->getbytes(3);
                    for(;;) {
                    
$this->getbytes(1);
                            if(!
$this->buffer[0]) {
                                break;
                            }
                            
$this->getbytes($this->buffer[0]);
                        }
                break;
            default:
                    for(;;) {
                    
$this->getbytes(1);
                        if(!
$this->buffer[0]) {
                            break;
                        }
                    
$this->getbytes($this->buffer[0]);
                }
            }
    }

    function 
arrcmp($b$s$l) {
        for(
$i 0$i $l$i++) {
            if(
$s{$i} != $b{$i}) {
                return 
false;
            }
        }
        return 
true;
    }

    function 
getbytes($l) {
        for(
$i 0$i $l$i++) {
            if(
$this->mod == 'C_FILE') {
                    
$bin unpack('C*'fread($this->fin1));
                    
$this->buffer[$i] = $bin[1];
                } elseif(
$this->mod == 'C_MEMORY') {
                        
$bin unpack('C*'substr($this->fin$this->ch1));
                        
$this->buffer[$i] = $bin[1];
                        
$this->ch++;
                }
        }
        return 
$this->buffer;
    }

    function 
putbytes($s$l) {
        for(
$i 0$i $l$i++) {
            
$this->fout .= pack('C*'$s[$i]);
        }
    }

    function 
getAnimation() {
        return 
$this->fout;
    }
}

?> ;


用法:
<img src="seccode.php?update=0.11426983225638004" width="160" height="60" onclick="this.src='seccode_1.php?update=0.11426983225638004'"/>
下载: seccode.rar (99.52 KB)
呵呵,粗略的搞下来了,有不妥的地方大家自己改改吧,改好了不要忘记传上来大家一起用,省得浪费其它人的时间嘛,呵。

呵呵,忘记说
$_SESSION["seccode"]
是验证码的值

不错,下来用了

那么长啊。。。

  谢谢LZ分享

Discuz6.0 动画验证码

真是太需要了,牛啊