php生成gif动画的方法


Posted in PHP onNovember 05, 2015

首先需要确认GD库是否正常,如果是合成图片,请确保把分解的图片放在frames的文件夹里面。
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(); 
?>

以上就是教大家如何利用php合成或是创建gif动画,希望大家仔细研究分享的两个实例,有所收获。

PHP 相关文章推荐
phpBB BBcode处理的漏洞
Oct 09 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
CodeIgniter图像处理类的深入解析
Jun 17 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
Feb 16 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP中危险的file_put_contents函数详解
Nov 04 PHP
详解PHP发送邮件知识点
May 06 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 #PHP
php无限分类使用concat如何实现
Nov 05 #PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 #PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 #PHP
双冒号 ::在PHP中的使用情况
Nov 05 #PHP
php根据用户语言跳转相应网页
Nov 04 #PHP
非常全面的php日期时间运算汇总
Nov 04 #PHP
You might like
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
浅析php学习的路线图
2013/07/10 PHP
PHP无限分类(树形类)
2013/09/28 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
php创建图像具体步骤
2017/03/13 PHP
学习ExtJS Column布局
2009/10/08 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
通过Pandas读取大文件的实例
2018/06/07 Python
python实现将汉字保存成文本的方法
2018/11/16 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
python excel转换csv代码实例
2019/08/26 Python
使用npy转image图像并保存的实例
2020/07/01 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
国际会计专业求职信
2014/08/04 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书