首页 > 作文

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

更新时间:2023-04-06 22:24:15 阅读: 评论:0

相信很多人都想过如何用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 < 32; $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 < strlen($authstr); $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 < 20; $k++)



{



$colorrandom = mt_rand(0,sizeof($colorlist)-1);



imagetpixel($image, rand()%70 , rand()%15 , $colorlist[$colorrandom]);



}



// 添加干扰线



for($k = 0; $k < 3; $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]);



}



el



{



$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类源码:

复制代码 代码如下:

<?php

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 < 3 ) ? $gif_dis : 3 ) : 2;

$this->col = ( $gif_red > -1 && $gif_grn > -1 && $gif_blu > -1 ) ?

( $gif_red | ( $gif_grn << 8 ) | ( $gif_blu << 16 ) ) : -1;

for ( $i = 0奇闻奇事; $i < count ( $gif_src ); $i++ ) {

if ( strtolower ( $gif_mod ) == “url” ) {

$this->buf [ ] = fread ( fopen ( $gif_src [ $i ], “rb” ), filesize ( $gif_src [ $i ] ) );

}

el if ( strtolower ( $gif_mod ) == “bin” ) {

$this->buf [ ] = $gif_src [ $i ];

}

el {

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 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ) ) ), $k = true; $k; $j++ ) {

switch ( $this->buf [ $i ] { $j } ) {

ca “!”:

if ( ( substr ( $this->buf [ $i ], ( $j + 3 ), 8 ) ) == “netscape” ) {

printf ( “%s: %s ( %s source )!”, $this->ver, $this->err [ ‘err03’ ], ( $i + 1 ) );

exit ( 0 );

}

break;

ca “;”:

$k = fal;

break;

}

}

}

gifencoder::gifaddheader ( );

for ( $i = 0; $i < count ( $this->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 << ( ord ( $this->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 << ( ord ( $this->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 << ( ord ( $this->buf [ 0 ] { 10 } ) & 0x07 );

$locals_len = 2 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 );

$global_rgb = substr ( $this->buf [ 0 ], 13,

3 * ( 2 << ( ord ( $this->buf [ 0 ] { 10 } ) & 0x07 ) ) );

$locals_rgb = substr ( $this->buf [ $i ], 13,

3 * ( 2 << ( ord ( $this->buf [ $i ] { 10 } ) & 0x07 ) ) );

$locals_ext = “!/xf9/x04” . chr ( ( $this->dis << 2 ) + 0 ) .

chr ( ( $d >> 0 ) & 0xff ) . chr ( ( $d >> 8 ) & 0xff ) . “/x0/x0”;

if ( $this->col > -1 滕王阁序&& ord ( $this->buf [ $i ] { 10 } ) & 0x80 ) {

for ( $j = 0; $j < ( 2 << ( ord ( $this->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 << 2 ) + 1 ) .

chr ( ( $d >> 0 ) & 0xff ) . chr ( ( $d >> 8 ) & 0xff ) . chr ( $j ) . “/x0”;

break;

}

错别字广告}

}

switch ( $locals_tmp { 0 } ) {

ca “!”:

$locals_img = substr ( $locals_tmp, 8, 10 );

$locals_tmp = substr ( $locals_tmp, 18, strlen ( $locals_tmp ) – 18 );

break;

ca “,”:

$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 );

}

el {

$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 );

}

}

el {

$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 );

}

}

el {

$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 < $len; $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 );

}

}

?>

本文发布于:2023-04-06 22:24:13,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/f075b9e8ef5b733069159aff7af33252.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP使用GIFEncoder类生成的GIF动态图片验证码.doc

本文 PDF 下载地址:PHP使用GIFEncoder类生成的GIF动态图片验证码.pdf

下一篇:返回列表
标签:代码   动画   奇事   很多人
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图