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 开发环境配置(测试开发环境)
Apr 28 PHP
PHP 小心urldecode引发的SQL注入漏洞
Oct 27 PHP
php四种基础算法代码实例
Oct 29 PHP
php发送post请求的三种方法
Feb 11 PHP
PHP缓存集成库phpFastCache用法
Dec 15 PHP
PHP上传文件时自动分配路径的方法
Jan 09 PHP
PIGCMS 如何关闭聊天机器人
Feb 12 PHP
推荐十款免费 WordPress 插件
Mar 24 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 PHP
用php实现分页效果的示例代码
Dec 10 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
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
layer设置maxWidth及maxHeight解决方案
2019/07/26 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
js如何验证密码强度
2020/03/18 Javascript
Vue computed 计算属性代码实例
2020/04/22 Javascript
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
Django单元测试工具test client使用详解
2019/08/02 Python
python列表推导式操作解析
2019/11/26 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
经济管理专业毕业生推荐信
2013/11/11 职场文书
幼儿园教师奖惩制度
2014/02/01 职场文书
物流专业自荐信
2014/05/23 职场文书
2014年学生党支部工作总结
2014/12/20 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server