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 相关文章推荐
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
Mar 15 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
如何用php获取程序执行的时间
Jun 09 PHP
深入Nginx + PHP 缓存详解
Jul 11 PHP
php管理nginx虚拟主机shell脚本实例
Nov 19 PHP
PHP之预定义接口详解
Jul 29 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
PHP命名空间namespace用法实例分析
Sep 27 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
php实现微信发红包功能
Jul 13 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 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新手谈谈我的学习心得
2007/02/25 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
28个JS验证函数收集
2010/03/02 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
2017/12/11 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
python 生成目录树及显示文件大小的代码
2009/07/23 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
python如何统计序列中元素
2020/07/31 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
将python代码和注释分离的方法
2018/04/21 Python
python 用 xlwings 库 生成图表的操作方法
2019/12/22 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
html通过canvas转成base64的方法
2019/07/18 HTML / CSS
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
科室工作的个人自我评价
2013/10/30 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
投资入股合作协议书
2014/10/28 职场文书
客户付款通知书
2015/04/23 职场文书
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript