PHP使用GIFEncoder類(lèi)處理gif圖片實(shí)例_PHP教程
Jul 13, 2016 am 10:26 AM
下面貼處理的源代碼:
require_once("gifencoder.php");?? //載入編碼 文件
$gif = new GIFEncoder();????????????? //實(shí)例化gif解碼對(duì)象
$gif->load("test.gif");??????????????????? //載入要解碼的gif圖像
for($i=0;$i
$im = imagecreatefromstring($gif->getgif($i));??????? //利用GD庫(kù)函數(shù)將GIF轉(zhuǎn)得標(biāo)準(zhǔn)些
imagegif($im, $i.".gif");???????????????????????????????? //用文件形式保存生成的每幀圖像數(shù)據(jù),當(dāng)然也可以用變量
}
imagedestroy($im);
ob_start();
for($i=0;sizeof($gif->IMGS["frames"]);$i++){
$im=imagecreatefromgif("0.gif");???? //根據(jù)每幀的圖片創(chuàng)建圖像
if($i>0){?????????????????????????????????????????? //不是第一幀 復(fù)制圖片和第一幀合并
?????? $frame=imagecreatefromgif("$i.gif");??????? //讀取當(dāng)前幀的圖像
??????? $w = imagesx($frame);??????????????????????????? //獲取圖像寬度
?????? $y= imagesy($frame);?????????????????????????? //獲取圖像高度
??????? imagecopy($im,$frame,0,0,0,0,$w,$y);??? //把當(dāng)前幀圖像和第一幀圖像復(fù)制合并
??????? imagedestroy($frame);????????????????????????????? //銷(xiāo)毀當(dāng)前圖像
}
imagejpeg($im,$i."frame.jpg");?????? //合并后保存為jpg格式
$im=imagecreatefromjpeg($i."frame.jpg");??? //從jpg格式重新創(chuàng)建圖像
imagegif($im);???????????????????????????????????????????????? //轉(zhuǎn)為gif格式
imagedestroy($im);?????????????????????????????????????? //銷(xiāo)毀圖像
??? $imagedata[] = ob_get_contents();?????? //創(chuàng)建這一幀的圖像數(shù)據(jù)
??? ob_clean();
}
$diy[]=0;//開(kāi)始延遲時(shí)間
$gif = new GIFEncoder($imagedata,$diy,0,2,0,0,0,"bin");??? //實(shí)例化gif編碼對(duì)象
ob_start();
Header ('Content-type:image/gif');
echo $gif->GetAnimation();
?>
以上代碼 基本就是一個(gè)完整的 讀取一個(gè)gif圖片,對(duì)其進(jìn)行解碼,然后再編碼成gif圖片的完整過(guò)程了..
有了這個(gè)就可以在網(wǎng)上隨意抓取gif圖片然后進(jìn)行修改。甚至直接用php就可以自己制作一些gif圖片.
GIFEncoder類(lèi)源碼:
?
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 );
??? }
}
?>
?

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

PHP設(shè)置的關(guān)鍵在於明確安裝方式、配置php.ini、連接Web服務(wù)器及啟用必要擴(kuò)展。 1.安裝PHP:Linux用apt、Mac用Homebrew、Windows推薦XAMPP;2.配置php.ini:調(diào)整錯(cuò)誤報(bào)告、上傳限制等並重啟服務(wù)器;3.搭配Web服務(wù)器:Apache通過(guò)mod_php,Nginx使用PHP-FPM;4.安裝常用擴(kuò)展:如mysqli、json、mbstring等以支持完整功能。

寫(xiě)好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋?xiě)?yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過(guò)於簡(jiǎn)單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類(lèi)、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

註釋不能馬虎是因?yàn)樗忉尨a存在的原因而非功能,例如兼容老接口或第三方限制,否則看代碼的人只能靠猜。必須加註釋的地方包括複雜的條件判斷、特殊的錯(cuò)誤處理邏輯、臨時(shí)繞過(guò)的限制。寫(xiě)註釋更實(shí)用的方法是根據(jù)場(chǎng)景選擇單行註釋或塊註釋?zhuān)瘮?shù)、類(lèi)、文件開(kāi)頭用文檔塊註釋說(shuō)明參數(shù)與返回值,並保持註釋更新,對(duì)複雜邏輯可在前面加一行概括整體意圖,同時(shí)不要用註釋封存代碼而應(yīng)使用版本控制工具。

PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

寫(xiě)好註釋的關(guān)鍵在於說(shuō)明“為什麼”而非僅“做了什麼”,提升代碼可讀性。 1.註釋?xiě)?yīng)解釋邏輯原因,例如值選擇或處理方式背後的考量;2.對(duì)複雜邏輯使用段落式註釋?zhuān)爬ê瘮?shù)或算法的整體思路;3.定期維護(hù)註釋確保與代碼一致,避免誤導(dǎo),必要時(shí)刪除過(guò)時(shí)內(nèi)容;4.在審查代碼時(shí)同步檢查註釋?zhuān)瑏K通過(guò)文檔記錄公共邏輯以減少代碼註釋負(fù)擔(dān)。

寫(xiě)好PHP註釋的關(guān)鍵在於清晰、有用且簡(jiǎn)潔。 1.註釋?xiě)?yīng)說(shuō)明代碼背後的意圖而非僅描述代碼本身,如解釋複雜條件判斷的邏輯目的;2.在魔術(shù)值、舊代碼兼容、API接口等關(guān)鍵場(chǎng)景添加註釋以提升可讀性;3.避免重複代碼內(nèi)容,保持簡(jiǎn)潔具體,並使用標(biāo)準(zhǔn)格式如PHPDoc;4.註釋需與代碼同步更新,確保準(zhǔn)確性。好的註釋?xiě)?yīng)站在他人角度思考,降低理解成本,成為代碼的理解導(dǎo)航儀。
