gif用到php_在php中如何输出动态gif

4c3ffd2de9fee0b8b2e53affc10e2fec.png

首先需要确认GD库是否正常,如果是合成图片,请确保把分解的图片放在frames的文件夹里面。

相关推荐:《PHP入门教程》

GIFEncoder.class.php 类

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 < 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 ] ) );

}

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 << ( 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; $i < count ( $this->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 << ( 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...

::

*/

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;

}

/*

:::::::::::::::::::::::::::::::::::::::::::::::::::

::

:: GIFAddFooter...

::

*/

function GIFAddFooter ( ) {

$this->GIF .= ";";

}

/*

:::::::::::::::::::::::::::::::::::::::::::::::::::

::

:: GIFBlockCompare...

::

*/

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 );

}

/*

:::::::::::::::::::::::::::::::::::::::::::::::::::

::

:: GIFWord...

::

*/

function GIFWord ( $int ) {

return ( chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );

}

/*

:::::::::::::::::::::::::::::::::::::::::::::::::::

::

:: GetAnimation...

::

*/

function GetAnimation ( ) {

return ( $this->GIF );

}

}

?>

为大家分享两个实例供大家参考:

实例 1 合成gif动画:<?php

include "GIFEncoder.class.php";

/*

Build a frames array from sources...

*/

if ( $dh = opendir ( "frames/" ) ) {

while ( false !== ( $dat = readdir ( $dh ) ) ) {

if ( $dat != "." && $dat != ".." ) {

$frames [ ] = "frames/$dat";

$framed [ ] = 5;

}

}

closedir ( $dh );

}

/*

GIFEncoder constructor:

=======================

image_stream = new GIFEncoder (

URL or Binary data 'Sources'

int 'Delay times'

int 'Animation loops'

int 'Disposal'

int 'Transparent red, green, blue colors'

int 'Source type'

);

*/

$gif = new GIFEncoder (

$frames,

$framed,

0,

2,

0, 0, 0,

"url"

);

/*

Possibles outputs:

==================

Output as GIF for browsers :

- Header ( 'Content-type:image/gif' );

Output as GIF for browsers with filename:

- Header ( 'Content-disposition:Attachment;filename=myanimation.gif');

Output as file to store into a specified file:

- 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 = new GIFEncoder(

$imagedata,

100,

0,

2,

0, 0, 1,

"bin"

);

Header ('Content-type:image/gif');

echo $gif->GetAnimation();

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值