PHP生成GIF动画实现动态图片验证码

 使用php的类编写的动画验证码模块

PHP代码
  1. <?php  
  2. /** 
  3. * 调用示例 
  4. * */  
  5. session_start();  
  6. $randCode = ”;  
  7. $chars = ‘abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ23456789′;  
  8. for ( $i = 0; $i < 4; $i++ )  
  9. {  
  10. $randCode .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);  
  11. }  
  12. $_SESSION['code'] = strtoupper($randCode); // 记录session  
  13. ImageCode($randCode, 60); // 显示GIF动画  
  14.   
  15. /** 
  16. * ImageCode 生成GIF图片验证 
  17. * @param $string 字符串 
  18. * @param $width 宽度 
  19. * @param $height 高度 
  20. * */  
  21. function ImageCode($string = ”, $width = 75, $height = 25)  
  22. {  
  23. $authstr = $string ? $string : ((time() % 2 == 0) ? mt_rand(1000, 9999) : mt_rand(10000, 99999));  
  24.   
  25. $board_width = $width;  
  26. $board_height = $height;  
  27. // 生成一个32帧的GIF动画  
  28. for($i = 0; $i < 32; $i++)  
  29. {  
  30. ob_start();  
  31. $image = imagecreate($board_width$board_height);  
  32. imagecolorallocate($image, 0,0,0);  
  33. // 设定文字颜色数组  
  34. $colorList[] = ImageColorAllocate($image, 15,73,210);  
  35. $colorList[] = ImageColorAllocate($image, 0,64,0);  
  36. $colorList[] = ImageColorAllocate($image, 0,0,64);  
  37. $colorList[] = ImageColorAllocate($image, 0,128,128);  
  38. $colorList[] = ImageColorAllocate($image, 27,52,47);  
  39. $colorList[] = ImageColorAllocate($image, 51,0,102);  
  40. $colorList[] = ImageColorAllocate($image, 0,0,145);  
  41. $colorList[] = ImageColorAllocate($image, 0,0,113);  
  42. $colorList[] = ImageColorAllocate($image, 0,51,51);  
  43. $colorList[] = ImageColorAllocate($image, 158,180,35);  
  44. $colorList[] = ImageColorAllocate($image, 59,59,59);  
  45. $colorList[] = ImageColorAllocate($image, 0,0,0);  
  46. $colorList[] = ImageColorAllocate($image, 1,128,180);  
  47. $colorList[] = ImageColorAllocate($image, 0,153,51);  
  48. $colorList[] = ImageColorAllocate($image, 60,131,1);  
  49. $colorList[] = ImageColorAllocate($image, 0,0,0);  
  50. $fontcolor = ImageColorAllocate($image, 0,0,0);  
  51. $gray = ImageColorAllocate($image, 245,245,245);  
  52.   
  53. $color = imagecolorallocate($image, 255,255,255);  
  54. $color2 = imagecolorallocate($image, 255,0,0);  
  55.   
  56. imagefill($image, 0, 0, $gray);  
  57.   
  58. $space = 15; // 字符间距  
  59. if($i > 0) // 屏蔽第一帧  
  60. {  
  61. for ($k = 0; $k < strlen($authstr); $k++)  
  62. {  
  63. $colorRandom = mt_rand(0,sizeof($colorList)-1);  
  64. $float_top = rand(0,4);  
  65. $float_left = rand(0,3);  
  66. imagestring($image, 6, $space * $k$top + $float_topsubstr($authstr$k, 1), $colorList[$colorRandom]);  
  67. }  
  68. }  
  69.   
  70. for ($k = 0; $k < 20; $k++)  
  71. {  
  72. $colorRandom = mt_rand(0,sizeof($colorList)-1);  
  73. imagesetpixel($image, rand()%70 , rand()%15 , $colorList[$colorRandom]);  
  74.   
  75. }  
  76. // 添加干扰线  
  77. for($k = 0; $k < 3; $k++)  
  78. {  
  79. $colorRandom = mt_rand(0, sizeof($colorList)-1);  
  80. // $todrawline = rand(0,1);  
  81. $todrawline = 1;  
  82. if($todrawline)  
  83. {  
  84. imageline($image, mt_rand(0, $board_width), mt_rand(0,$board_height), mt_rand(0,$board_width), mt_rand(0,$board_height), $colorList[$colorRandom]);  
  85. }  
  86. else  
  87. {  
  88. $w = mt_rand(0,$board_width);  
  89. $h = mt_rand(0,$board_width);  
  90. imagearc($image$board_width – floor($w / 2) , floor($h / 2), $w$h, rand(90,180), rand(180,270), $colorList[$colorRandom]);  
  91. }  
  92. }  
  93. imagegif($image);  
  94. imagedestroy($image);  
  95. $imagedata[] = ob_get_contents();  
  96. ob_clean();  
  97. ++$i;  
  98. }  
  99.   
  100. $gif = new GIFEncoder($imagedata);  
  101. Header (‘Content-type:image/gif’);  
  102. echo $gif->GetAnimation();  
  103. }  
  104. /** 
  105. * GIFEncoder类 
  106. * */  
  107. Class GIFEncoder  
  108. {  
  109. var $GIF = “GIF89a”; /* GIF header 6 bytes */  
  110. var $VER = “GIFEncoder V2.06″; /* Encoder version */  
  111.   
  112. var $BUF = Array ( );  
  113. var $LOP = 0;  
  114. var $DIS = 2;  
  115. var $COL = -1;  
  116. var $IMG = -1;  
  117.   
  118. var $ERR = Array (  
  119. ‘ERR00′ =>”Does not supported function for only one image!”,  
  120. ‘ERR01′ =>”Source is not a GIF image!”,  
  121. ‘ERR02′ =>”Unintelligible flag “,  
  122. ‘ERR03′ =>”Could not make animation from animated GIF source”,  
  123. );  
  124.   
  125. function GIFEncoder ($GIF_src$GIF_dly = 100, $GIF_lop = 0, $GIF_dis = 0, $GIF_red = 0, $GIF_grn = 0, $GIF_blu = 0, $GIF_mod = ‘bin’ )  
  126. {  
  127. if (!is_array($GIF_src) && !is_array($GIF_tim))  
  128. {  
  129. printf ( “%s: %s”, $this->VER, $this->ERR['ERR00']);  
  130. exit( 0 );  
  131. }  
  132. $this->LOP = ($GIF_lop > -1) ? $GIF_lop : 0;  
  133. $this->DIS = ($GIF_dis > -1) ? (( $GIF_dis < 3 ) ? $GIF_dis : 3) : 2;  
  134. $this->COL = ($GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1) ? ($GIF_red | ($GIF_grn << 8) | ($GIF_blu << 16)) : -1;  
  135.   
  136. for ($i = 0, $src_count = count($GIF_src); $i < $src_count$i++ )  
  137. {  
  138. if (strToLower$GIF_mod ) == “url”)  
  139. {  
  140. $this->BUF[] = fread (fopen($GIF_src [$i], “rb”), filesize ($GIF_src [$i]));  
  141. }  
  142. elseif(strToLower($GIF_mod) == “bin”)  
  143. {  
  144. $this->BUF [ ] = $GIF_src [ $i ];  
  145. }  
  146. else  
  147. {  
  148. printf(“%s: %s ( %s )!”, $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod);  
  149. exit(0);  
  150. }  
  151. if (substr($this->BUF[$i], 0, 6) != “GIF87a” && substr($this->BUF [$i], 0, 6) != “GIF89a”)  
  152. {  
  153. printf( “%s: %d %s”, $this->VER, $i$this->ERR ['ERR01']);  
  154. exit(0);  
  155. }  
  156. for ($j = (13 + 3 * (2 << (ord($this->BUF[$i]{10}) & 0×07 ))), $k = TRUE; $k$j++)  
  157. {  
  158. switch ($this->BUF [$i]{$j})  
  159. {  
  160. case “!”:  
  161. if ((substr($this->BUF[$i], ($j + 3), 8)) == “NETSCAPE”)  
  162. {  
  163. printf( “%s: %s ( %s source )!”, $this->VER, $this->ERR ['ERR03'], ($i + 1));  
  164. exit( 0 );  
  165. }  
  166. break;  
  167. case “;”:  
  168. $k = FALSE;  
  169. break;  
  170. }  
  171. }  
  172. }  
  173. GIFEncoder::GIFAddHeader();  
  174. for($i = 0, $count_buf = count($this->BUF); $i < $count_buf$i++)  
  175. {  
  176. GIFEncoder::GIFAddFrames($i$GIF_dly[$i]);  
  177. }  
  178. GIFEncoder::GIFAddFooter();  
  179. }  
  180.   
  181. function GIFAddHeader ( )  
  182. {  
  183. $cmap = 0;  
  184.   
  185. if (ord($this->BUF[0]{10}) & 0×80 )  
  186. {  
  187. $cmap = 3 * ( 2 << ( ord ( $this->BUF [ 0 ]{10} ) & 0×07 ));  
  188.   
  189. $this->GIF .= substr ( $this->BUF [ 0 ], 6, 7);  
  190. $this->GIF .= substr ( $this->BUF [ 0 ], 13, $cmap);  
  191. $this->GIF .= “!\377\13NETSCAPE2.0\3\1″ . GIFEncoder::GIFWord ( $this->LOP ) . “\0″;  
  192. }  
  193. }  
  194.   
  195. function GIFAddFrames ( $i$d )  
  196. {  
  197.   
  198. $Locals_str = 13 + 3 * (2 <<(ord($this->BUF[$i]{10}) & 0×07));  
  199.   
  200. $Locals_end = strlen($this->BUF[$i]) – $Locals_str – 1;  
  201. $Locals_tmp = substr ($this->BUF[$i], $Locals_str$Locals_end);  
  202.   
  203. $Global_len = 2 << (ord( $this->BUF [0]{10} ) & 0×07 );  
  204. $Locals_len = 2 << (ord( $this->BUF[$i]{10}) & 0×07);  
  205.   
  206. $Global_rgb = substr($this->BUF[0], 13, 3 * (2 << ( ord ( $this->BUF[0]{10} ) & 0×07)));  
  207. $Locals_rgb = substr ( $this->BUF[$i], 13, 3 * (2 << ( ord ( $this->BUF[$i]{10} ) & 0×07)));  
  208.   
  209. $Locals_ext = “!\xF9\x04″ . chr(($this->DIS << 2) + 0) . chr(($d >> 0) & 0xFF) . chr(($d >> 8) & 0xFF) . “\x0\x0″;  
  210.   
  211. if ( $this->COL > -1 && ord($this->BUF[$i]{10}) & 0×80)  
  212. {  
  213. for($j = 0; $j < (2 << (ord( $this->BUF[$i]{10}) & 0×07)); $j++ )  
  214. {  
  215. 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 )  
  216. {  
  217. $Locals_ext = “!\xF9\x04″ . chr(($this->DIS << 2) + 1) . chr (( $d >> 0) & 0xFF) . chr (( $d >> 8) & 0xFF) . chr ($j) . “\x0″;  
  218. break;  
  219. }  
  220. }  
  221. }  
  222. switch ( $Locals_tmp { 0 } )  
  223. {  
  224. case “!”:  
  225. $Locals_img = substr($Locals_tmp, 8, 10);  
  226. $Locals_tmp = substr($Locals_tmp, 18, strlen ($Locals_tmp) – 18);  
  227. break;  
  228. case “,”:  
  229. $Locals_img = substr($Locals_tmp, 0, 10);  
  230. $Locals_tmp = substr($Locals_tmp, 10, strlen($Locals_tmp) – 10);  
  231. break;  
  232. }  
  233. if ( ord ( $this->BUF[$i]{10} ) & 0×80 && $this->IMG > -1 )  
  234. {  
  235. if ( $Global_len == $Locals_len )  
  236. {  
  237. if ( GIFEncoder::GIFBlockCompare ( $Global_rgb$Locals_rgb$Global_len ) )  
  238. {  
  239. $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );  
  240. }  
  241. else  
  242. {  
  243. $byte = ord ( $Locals_img{9});  
  244. $byte |= 0×80;  
  245. $byte &= 0xF8;  
  246. $byte |= ( ord ( $this->BUF [ 0 ]{10}) & 0×07);  
  247. $Locals_img{9} = chr($byte);  
  248. $this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);  
  249. }  
  250. }  
  251. else  
  252. {  
  253. $byte = ord($Locals_img{9});  
  254. $byte |= 0×80;  
  255. $byte &= 0xF8;  
  256. $byte |= (ord($this->BUF[$i]{10}) & 0×07);  
  257. $Locals_img {9} = chr($byte);  
  258. $this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);  
  259. }  
  260. }  
  261. else  
  262. {  
  263. $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );  
  264. }  
  265. $this->IMG = 1;  
  266. }  
  267.   
  268. function GIFAddFooter ( ) {  
  269. $this->GIF .= “;”;  
  270. }  
  271.   
  272. function GIFBlockCompare ( $GlobalBlock$LocalBlock$Len )  
  273. {  
  274. for ( $i = 0; $i < $Len$i++ )  
  275. {  
  276. 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})  
  277. {  
  278. return ( 0 );  
  279. }  
  280. }  
  281. return ( 1 );  
  282. }  
  283.   
  284. function GIFWord ( $int )  
  285. {  
  286. return ( chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );  
  287. }  
  288.   
  289. function GetAnimation ( )  
  290. {  
  291. return ($this->GIF);  
  292. }  
  293. }  

 



上一篇: 用PHP判断gif图片是不是动画
下一篇: Php提升效率优化技巧
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: php
相关日志:
评论: 0 | 引用: 0 | 查看次数: 3725
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑