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 相关文章推荐
php中处理模拟rewrite 效果
Dec 09 PHP
深入理解PHP之require/include顺序 推荐
Jan 02 PHP
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
Sep 11 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
PHP编写简单的App接口
Aug 28 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
PHP设计模式之PHP迭代器模式讲解
Mar 22 PHP
laravel validate 设置为中文的例子(验证提示为中文)
Sep 29 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 身份证号验证函数
2009/05/07 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php中经典方法实现判断多维数组是否为空
2011/10/23 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
python中的__init__ 、__new__、__call__小结
2014/04/25 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
python递归下载文件夹下所有文件
2019/08/31 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
班级年度安全计划书
2014/05/01 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
停水通知
2015/04/16 职场文书
配置nginx负载均衡
2022/05/06 Servers