php生成动态验证码gif图片,
php生成动态验证码gif图片,
这是一个通过php生成的动态验证码图片的示例,重点是可以运行哦!下面先发下效果图:
下面是php生成动态验证码需要用到的相关类和函数。
<?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){// 屏蔽第一帧 $top=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); imagesetpixel($image,rand()%70,rand()%15,$colorList[$colorRandom]); } // 添加干扰线 for($k=0;$k<3;$k++){ $colorRandom=mt_rand(0,sizeof($colorList)-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", ); 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'){ 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,$src_count=count($GIF_src);$i<$src_count;$i++){ if(strToLower($GIF_mod)=="url"){ $this->BUF[]=fread(fopen($GIF_src [$i],"rb"),filesize($GIF_src [$i])); }elseif(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<<(ord($this->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,$count_buf=count($this->BUF);$i<$count_buf;$i++){ GIFEncoder::GIFAddFrames($i,$GIF_dly[$i]); } GIFEncoder::GIFAddFooter(); } 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"; } } 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}){ 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; } function GIFAddFooter(){ $this->GIF.=";"; } 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); } function GIFWord($int){ return(chr($int&0xFF).chr(($int>>8)&0xFF)); } function GetAnimation(){ return($this->GIF); } }
php生成动态验证码用法示例:
/*调用示例*/ session_start(); $checkCode=''; $chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ23456789'; for($i=0;$i<4;$i++){ $checkCode.=substr($chars,mt_rand(0,strlen($chars)-1),1); } $_SESSION['code']=strtoupper($checkCode);// 记录session ImageCode($checkCode,60);// 显示GIF动画
以上就是php如何生成动态验证码的实现方法,希望对大家的学习有所帮助。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
