Heim  >  Artikel  >  Backend-Entwicklung  >  PHP使用GIFEncoder类生成的GIF动态图片验证码_PHP教程

PHP使用GIFEncoder类生成的GIF动态图片验证码_PHP教程

WBOY
WBOYOriginal
2016-07-13 10:26:21860Durchsuche

相信很多人都想过如何用PHP生成GIF动画来实现动态图片验证码,以下是实现过程。
ImageCode函数通过GIFEncoder类实现的GIF动画的PHP源代码,有兴趣的朋友可以研究一下。

效果如图:

复制代码 代码如下:

/**
 
* ImageCode 生成GIF图片验证
 
* @param $string 字符串
 
* @param $width 宽度
 
* @param $height 高度
 
* */
 
function ImageCode($string = '', $width = 75, $height = 25)
 
{
 
$authstr = $string ? $string : ((time() % 2 == 0) ? mt_rand(1000, 9999) : mt_rand(10000, 99999));
 
$board_width = $width;
 
$board_height = $height;
 
// 生成一个32帧的GIF动画
 
for($i = 0; $i  
{
 
ob_start();
 
$image = imagecreate($board_width, $board_height);
 
imagecolorallocate($image, 0,0,0);
 
// 设定文字颜色数组
 
$colorList[] = ImageColorAllocate($image, 15,73,210);
 
$colorList[] = ImageColorAllocate($image, 0,64,0);
 
$colorList[] = ImageColorAllocate($image, 0,0,64);
 
$colorList[] = ImageColorAllocate($image, 0,128,128);
 
$colorList[] = ImageColorAllocate($image, 27,52,47);
 
$colorList[] = ImageColorAllocate($image, 51,0,102);
 
$colorList[] = ImageColorAllocate($image, 0,0,145);
 
$colorList[] = ImageColorAllocate($image, 0,0,113);
 
$colorList[] = ImageColorAllocate($image, 0,51,51);
 
$colorList[] = ImageColorAllocate($image, 158,180,35);
 
$colorList[] = ImageColorAllocate($image, 59,59,59);
 
$colorList[] = ImageColorAllocate($image, 0,0,0);
 
$colorList[] = ImageColorAllocate($image, 1,128,180);
 
$colorList[] = ImageColorAllocate($image, 0,153,51);
 
$colorList[] = ImageColorAllocate($image, 60,131,1);
 
$colorList[] = ImageColorAllocate($image, 0,0,0);
 
$fontcolor = ImageColorAllocate($image, 0,0,0);
 
$gray = ImageColorAllocate($image, 245,245,245);
 
$color = imagecolorallocate($image, 255,255,255);
 
$color2 = imagecolorallocate($image, 255,0,0);
 
imagefill($image, 0, 0, $gray);
 
$space = 15; // 字符间距
 
if($i > 0) // 屏蔽第一帧
 
{
 
for ($k = 0; $k  
{
 
$colorRandom = mt_rand(0,sizeof($colorList)-1);
 
$float_top = rand(0,4);
 
$float_left = rand(0,3);
 
imagestring($image, 6, $space * $k, $top + $float_top, substr($authstr, $k, 1), $colorList[$colorRandom]);
 
}
 
}
 
for ($k = 0; $k  
{
 
$colorRandom = mt_rand(0,sizeof($colorList)-1);
 
imagesetpixel($image, rand()%70 , rand()%15 , $colorList[$colorRandom]);
 
}
 
// 添加干扰线
 
for($k = 0; $k  
{
 
$colorRandom = mt_rand(0, sizeof($colorList)-1);
 
// $todrawline = rand(0,1);
 
$todrawline = 1;
 
if($todrawline)
 
{
 
imageline($image, mt_rand(0, $board_width), mt_rand(0,$board_height), mt_rand(0,$board_width), mt_rand(0,$board_height), $colorList[$colorRandom]);
 
}
 
else
 
{
 
$w = mt_rand(0,$board_width);
 
$h = mt_rand(0,$board_width);
 
imagearc($image, $board_width - floor($w / 2) , floor($h / 2), $w, $h, rand(90,180), rand(180,270), $colorList[$colorRandom]);
 
}
 
}
 
imagegif($image);
 
imagedestroy($image);
 
$imagedata[] = ob_get_contents();
 
ob_clean();
 
++$i;
 
}
 
$gif = new GIFEncoder($imagedata);
 
Header ('Content-type:image/gif');
 
echo $gif->GetAnimation();
 
}

GIFEncoder类源码:

复制代码 代码如下:

Class GIFEncoder {
    var $GIF = "GIF89a";                /* GIF header 6 bytes        */
    var $VER = "GIFEncoder V2.06";        /* Encoder version                */
    var $BUF = Array ( );
    var $LOP =  0;
    var $DIS =  2;
    var $COL = -1;
    var $IMG = -1;
    var $ERR = Array (
    'ERR00' =>"Does not supported function for only one image!",
    'ERR01' =>"Source is not a GIF image!",
    'ERR02' =>"Unintelligible flag ",
    'ERR03' =>"Could not make animation from animated GIF source",
    );
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    ::        GIFEncoder...
    ::
    */
    function GIFEncoder        (
    $GIF_src, $GIF_dly, $GIF_lop, $GIF_dis,
    $GIF_red, $GIF_grn, $GIF_blu, $GIF_mod
    ) {
        if ( ! is_array ( $GIF_src ) && ! is_array ( $GIF_tim ) ) {
            printf        ( "%s: %s", $this->VER, $this->ERR [ 'ERR00' ] );
            exit        ( 0 );
        }
        $this->LOP = ( $GIF_lop > -1 ) ? $GIF_lop : 0;
        $this->DIS = ( $GIF_dis > -1 ) ? ( ( $GIF_dis         $this->COL = ( $GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1 ) ?
        ( $GIF_red | ( $GIF_grn         for ( $i = 0; $i             if ( strToLower ( $GIF_mod ) == "url" ) {
                $this->BUF [ ] = fread ( fopen ( $GIF_src [ $i ], "rb" ), filesize ( $GIF_src [ $i ] ) );
            }
            else if ( strToLower ( $GIF_mod ) == "bin" ) {
                $this->BUF [ ] = $GIF_src [ $i ];
            }
            else {
                printf        ( "%s: %s ( %s )!", $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod );
                exit        ( 0 );
            }
            if ( substr ( $this->BUF [ $i ], 0, 6 ) != "GIF87a" && substr ( $this->BUF [ $i ], 0, 6 ) != "GIF89a" ) {
                printf        ( "%s: %d %s", $this->VER, $i, $this->ERR [ 'ERR01' ] );
                exit        ( 0 );
            }
            for ( $j = ( 13 + 3 * ( 2 BUF [ $i ] { 10 } ) & 0x07 ) ) ), $k = TRUE; $k; $j++ ) {
                switch ( $this->BUF [ $i ] { $j } ) {
                    case "!":
                        if ( ( substr ( $this->BUF [ $i ], ( $j + 3 ), 8 ) ) == "NETSCAPE" ) {
                            printf        ( "%s: %s ( %s source )!", $this->VER, $this->ERR [ 'ERR03' ], ( $i + 1 ) );
                            exit        ( 0 );
                        }
                        break;
                    case ";":
                        $k = FALSE;
                        break;
                }
            }
        }
        GIFEncoder::GIFAddHeader ( );
        for ( $i = 0; $i BUF ); $i++ ) {
            GIFEncoder::GIFAddFrames ( $i, $GIF_dly [ $i ] );
        }
        GIFEncoder::GIFAddFooter ( );
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    ::        GIFAddHeader...
    ::
    */
    function GIFAddHeader ( ) {
        $cmap = 0;
        if ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x80 ) {
            $cmap = 3 * ( 2 BUF [ 0 ] { 10 } ) & 0x07 ) );
            $this->GIF .= substr ( $this->BUF [ 0 ], 6, 7                );
            $this->GIF .= substr ( $this->BUF [ 0 ], 13, $cmap        );
            $this->GIF .= "!/377/13NETSCAPE2.0/3/1" . GIFEncoder::GIFWord ( $this->LOP ) . "/0";
        }
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    ::        GIFAddFrames...
    ::
    */
    function GIFAddFrames ( $i, $d ) {
        $Locals_str = 13 + 3 * ( 2 BUF [ $i ] { 10 } ) & 0x07 ) );
        $Locals_end = strlen ( $this->BUF [ $i ] ) - $Locals_str - 1;
        $Locals_tmp = substr ( $this->BUF [ $i ], $Locals_str, $Locals_end );
        $Global_len = 2 BUF [ 0  ] { 10 } ) & 0x07 );
        $Locals_len = 2 BUF [ $i ] { 10 } ) & 0x07 );
        $Global_rgb = substr ( $this->BUF [ 0  ], 13,
        3 * ( 2 BUF [ 0  ] { 10 } ) & 0x07 ) ) );
        $Locals_rgb = substr ( $this->BUF [ $i ], 13,
        3 * ( 2 BUF [ $i ] { 10 } ) & 0x07 ) ) );
        $Locals_ext = "!/xF9/x04" . chr ( ( $this->DIS         chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . "/x0/x0";
        if ( $this->COL > -1 && ord ( $this->BUF [ $i ] { 10 } ) & 0x80 ) {
            for ( $j = 0; $j BUF [ $i ] { 10 } ) & 0x07 ) ); $j++ ) {
                if        (
                ord ( $Locals_rgb { 3 * $j + 0 } ) == ( $this->COL >>  0 ) & 0xFF &
                ord ( $Locals_rgb { 3 * $j + 1 } ) == ( $this->COL >>  8 ) & 0xFF &
                ord ( $Locals_rgb { 3 * $j + 2 } ) == ( $this->COL >> 16 ) & 0xFF
                ) {
                    $Locals_ext = "!/xF9/x04" . chr ( ( $this->DIS                     chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . chr ( $j ) . "/x0";
                    break;
                }
            }
        }
        switch ( $Locals_tmp { 0 } ) {
            case "!":
                $Locals_img = substr ( $Locals_tmp, 8, 10 );
                $Locals_tmp = substr ( $Locals_tmp, 18, strlen ( $Locals_tmp ) - 18 );
                break;
            case ",":
                $Locals_img = substr ( $Locals_tmp, 0, 10 );
                $Locals_tmp = substr ( $Locals_tmp, 10, strlen ( $Locals_tmp ) - 10 );
                break;
        }
        if ( ord ( $this->BUF [ $i ] { 10 } ) & 0x80 && $this->IMG > -1 ) {
            if ( $Global_len == $Locals_len ) {
                if ( GIFEncoder::GIFBlockCompare ( $Global_rgb, $Locals_rgb, $Global_len ) ) {
                    $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
                }
                else {
                    $byte  = ord ( $Locals_img { 9 } );
                    $byte |= 0x80;
                    $byte &= 0xF8;
                    $byte |= ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 );
                    $Locals_img { 9 } = chr ( $byte );
                    $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
                }
            }
            else {
                $byte  = ord ( $Locals_img { 9 } );
                $byte |= 0x80;
                $byte &= 0xF8;
                $byte |= ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );
                $Locals_img { 9 } = chr ( $byte );
                $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );
            }
        }
        else {
            $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );
        }
        $this->IMG  = 1;
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    ::        GIFAddFooter...
    ::
    */
    function GIFAddFooter ( ) {
        $this->GIF .= ";";
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    ::        GIFBlockCompare...
    ::
    */
    function GIFBlockCompare ( $GlobalBlock, $LocalBlock, $Len ) {
        for ( $i = 0; $i             if        (
            $GlobalBlock { 3 * $i + 0 } != $LocalBlock { 3 * $i + 0 } ||
            $GlobalBlock { 3 * $i + 1 } != $LocalBlock { 3 * $i + 1 } ||
            $GlobalBlock { 3 * $i + 2 } != $LocalBlock { 3 * $i + 2 }
            ) {
                return ( 0 );
            }
        }
        return ( 1 );
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    ::        GIFWord...
    ::
    */
    function GIFWord ( $int ) {
        return ( chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );
    }
    /*
    :::::::::::::::::::::::::::::::::::::::::::::::::::
    ::
    ::        GetAnimation...
    ::
    */
    function GetAnimation ( ) {
        return ( $this->GIF );
    }
}
?>

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/824715.htmlTechArticle相信很多人都想过如何用PHP生成GIF动画来实现动态图片验证码,以下是实现过程。 ImageCode函数通过GIFEncoder类实现的GIF动画的PHP源代码,有...
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn