PHP使用GIFEncoder类处理gif图片实例


Posted in PHP onJuly 01, 2014

下面贴处理的源代码:

<?php

require_once("gifencoder.php");   //载入编码 文件

$gif = new GIFEncoder();              //实例化gif解码对象

$gif->load("test.gif");                    //载入要解码的gif图像

for($i=0;$i<sizeof($gif->IMGS["frames"]);$i++){       //根据 gif图像的帧数获取每帧的图像数据

$im = imagecreatefromstring($gif->getgif($i));        //利用GD库函数将GIF转得标准些

imagegif($im, $i.".gif");                                 //用文件形式保存生成的每帧图像数据,当然也可以用变量

}

imagedestroy($im);

ob_start();

for($i=0;sizeof($gif->IMGS["frames"]);$i++){

$im=imagecreatefromgif("0.gif");     //根据每帧的图片创建图像 

if($i>0){                                           //不是第一帧 复制图片和第一帧合并 

       $frame=imagecreatefromgif("$i.gif");        //读取当前帧的图像

        $w = imagesx($frame);                            //获取图像宽度

       $y= imagesy($frame);                           //获取图像高度

        imagecopy($im,$frame,0,0,0,0,$w,$y);    //把当前帧图像和第一帧图像复制合并

        imagedestroy($frame);                              //销毁当前图像

}

imagejpeg($im,$i."frame.jpg");       //合并后保存为jpg格式

$im=imagecreatefromjpeg($i."frame.jpg");    //从jpg格式重新创建图像

imagegif($im);                                                 //转为gif格式

imagedestroy($im);                                       //销毁图像

    $imagedata[] = ob_get_contents();       //创建这一帧的图像数据 

    ob_clean(); 

}

$diy[]=0;//开始延迟时间 

$gif = new GIFEncoder($imagedata,$diy,0,2,0,0,0,"bin");    //实例化gif编码对象

ob_start(); 

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

echo $gif->GetAnimation(); 

?>

以上代码 基本就是一个完整的 读取一个gif图片,对其进行解码,然后再编码成gif图片的完整过程了..
有了这个就可以在网上随意抓取gif图片然后进行修改。甚至直接用php就可以自己制作一些gif图片.

GIFEncoder类源码:

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

    }

}

?>

 
PHP 相关文章推荐
PHP 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
深入PHP nl2br()格式化输出的详解
Jun 05 PHP
Youku 视频绝对地址获取的方法详解
Jun 26 PHP
php实现parent调用父类的构造方法与被覆写的方法
Feb 11 PHP
php支持中文字符串分割的函数
May 28 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
php创建类并调用的实例方法
Sep 25 PHP
ThinkPHP模板IF标签用法详解
Jul 01 #PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 #PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 #PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 #PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 #PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 #PHP
ThinkPHP模板判断输出Present标签用法详解
Jun 30 #PHP
You might like
Terran兵种对照表
2020/03/14 星际争霸
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
用户注册常用javascript代码
2009/08/29 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Jupyter加载文件的实现方法
2020/04/14 Python
C#面试题
2016/05/06 面试题
党委书记岗位职责
2013/11/24 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
撤诉书怎么写
2015/05/19 职场文书
单身证明格式样本
2015/06/15 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang