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动画,希望大家仔细研究分享的两个实例,有所收获。
热门推荐
10 上岸离职祝福语大全简短
11 朋友搞笑蛋糕祝福语简短
12 离职横幅升职祝福语简短
13 春节祝福语简短英文高级
14 除夕的拜年祝福语简短
15 周末新人祝福语短句简短
16 同事调离的祝福语简短
17 浪漫的未来祝福语简短
18 老师圣诞贺卡祝福语简短