php生成gif动画的方法
首先需要确认GD库是否正常,如果是合成图片,请确保把分解的图片放在frames的文件夹里面。
GIFEncoder.class.php类
<? ClassGIFEncoder{ var$GIF="GIF89a";/*GIFheader6bytes*/ var$VER="GIFEncoderV2.06";/*Encoderversion*/ var$BUF=Array(); var$LOP=0; var$DIS=2; var$COL=-1; var$IMG=-1; var$ERR=Array( 'ERR00'=>"Doesnotsupportedfunctionforonlyoneimage!", 'ERR01'=>"SourceisnotaGIFimage!", 'ERR02'=>"Unintelligibleflag", 'ERR03'=>"CouldnotmakeanimationfromanimatedGIFsource", ); /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: ::GIFEncoder... :: */ functionGIFEncoder( $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])); } 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(%ssource)!",$this->VER,$this->ERR['ERR03'],($i+1)); exit(0); } break; case";": $k=FALSE; break; } } } GIFEncoder::GIFAddHeader(); for($i=0;$i<count($this->BUF);$i++){ GIFEncoder::GIFAddFrames($i,$GIF_dly[$i]); } GIFEncoder::GIFAddFooter(); } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: ::GIFAddHeader... :: */ functionGIFAddHeader(){ $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... :: */ functionGIFAddFrames($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; } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: ::GIFAddFooter... :: */ functionGIFAddFooter(){ $this->GIF.=";"; } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: ::GIFBlockCompare... :: */ functionGIFBlockCompare($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... :: */ functionGIFWord($int){ return(chr($int&0xFF).chr(($int>>8)&0xFF)); } /* ::::::::::::::::::::::::::::::::::::::::::::::::::: :: ::GetAnimation... :: */ functionGetAnimation(){ return($this->GIF); } } ?>
为大家分享两个实例供大家参考:
实例1合成gif动画:
<?php include"GIFEncoder.class.php"; /* Buildaframesarrayfromsources... */ if($dh=opendir("frames/")){ while(false!==($dat=readdir($dh))){ if($dat!="."&&$dat!=".."){ $frames[]="frames/$dat"; $framed[]=5; } } closedir($dh); } /* GIFEncoderconstructor: ======================= image_stream=newGIFEncoder( URLorBinarydata'Sources' int'Delaytimes' int'Animationloops' int'Disposal' int'Transparentred,green,bluecolors' int'Sourcetype' ); */ $gif=newGIFEncoder( $frames, $framed, 0, 2, 0,0,0, "url" ); /* Possiblesoutputs: ================== OutputasGIFforbrowsers: -Header('Content-type:image/gif'); OutputasGIFforbrowserswithfilename: -Header('Content-disposition:Attachment;filename=myanimation.gif'); Outputasfiletostoreintoaspecifiedfile: -FWrite(FOpen("myanimation.gif","wb"),$gif->GetAnimation()); */ Header('Content-type:image/gif'); echo$gif->GetAnimation(); ?>
实例2创建gif动画:
<?php include"GIFEncoder.class.php"; ob_start(); $board_width=60; $board_height=60; $pad_width=5; $pad_height=15; $ball_size=5; $game_width=$board_width-$pad_width*2-$ball_size; $game_height=$board_height-$ball_size; $x=0; $y=rand(0,$game_height); $xv=rand(1,10); $yv=rand(1,10); $pt[]=array($x,$y); do{ $x+=$xv; $y+=$yv; if($x>$game_width){ $xv=-1*$xv; $x=$game_width-($x-$game_width); }elseif($x<0){ $xv=-1*$xv; $x=abs($x); } if($y>$game_height){ $yv=-1*$yv; $y=$game_height-($y-$game_height); }elseif($y<0){ $yv=-1*$yv; $y=abs($y); } $pt[]=array($x,$y); }while($x!=$pt[0][0]||$y!=$pt[0][1]); $i=0; while(isset($pt[$i])){ $image=imagecreate($board_width,$board_height); imagecolorallocate($image,0,0,0); $color=imagecolorallocate($image,255,255,255); $color2=imagecolorallocate($image,255,0,0); if($pt[$i][1]+$pad_height<$board_width){ imagefilledrectangle($image,0,$pt[$i][1],$pad_width,$pt[$i][1]+$pad_height,$color); }else{ imagefilledrectangle($image,0,$board_width-$pad_height,$pad_width,$board_width,$color); } imagefilledrectangle($image,$board_width-$pad_width,0,$board_width,$board_height,$color2); imagefilledrectangle($image,$pad_width+$pt[$i][0],$ball_size+$pt[$i][1]-$ball_size,$pad_width+$pt[$i][0]+$ball_size,$ball_size+$pt[$i][1],$color); //imagesetpixel($image,$pt[$i][0],$pt[$i][1],$color); imagegif($image); imagedestroy($image); $imagedata[]=ob_get_contents(); ob_clean(); ++$i; } $gif=newGIFEncoder( $imagedata, 100, 0, 2, 0,0,1, "bin" ); Header('Content-type:image/gif'); echo$gif->GetAnimation(); ?>
以上就是教大家如何利用php合成或是创建gif动画,希望大家仔细研究分享的两个实例,有所收获。