PHP之生成GIF动画的实现方法

代码如下所示:


代码如下:

<?
class GifMerge {
    var $ver            = '1.1';
    var $dly            = 50;
    var $mod            = 'C_FILE';
    var $first            = true;
    var $use_loop            = false;
    var $transparent        = false;
    var $use_global_in        = false;
    var $x                = 0;
    var $y                = 0;
    var $ch                = 0;
    var $fin            = 0;
    var $fout            = '';
    var $loop            = 0;
    var $delay            = 0;
    var $width            = 0;
    var $height            = 0;
    var $trans1             = 255;
    var $trans2             = 255;
    var $trans3             = 255;
    var $disposal            = 2;
    var $out_color_table_size    = 0;
    var $local_color_table_flag    = 0;
    var $global_color_table_size    = 0;
    var $out_color_table_sizecode    = 0;
    var $global_color_table_sizecode= 0;
    var $gif            = array(0x47, 0x49, 0x46);
    var $buffer            = array();
    var $local_in            = array();
    var $global_in            = array();
    var $global_out            = array();
    var $logical_screen_descriptor    = array();
    function GifMerge($images, $t1, $t2, $t3, $loop, $dl, $xpos, $ypos, $model) {
        if($model) {
            $this->mod = $model;
        }
        if($loop > -1) {
            $this->loop = floor($loop - 1);
            $this->use_loop = true;
        }
        if($t1 > -1 && $t2 > -1 && $t3 > -1) {
            $this->trans1 = $t1;
            $this->trans2 = $t2;
            $this->trans3 = $t3;
            $this->transparent = true;
        }
        for($i = 0; $i < count($images); $i++) {
            $dl[$i]    ? $this->delay = $dl[$i] : $this->delay = $this->dly;
            $xpos[$i] ? $this->x = $xpos[$i] : $this->x = 0;
            $ypos[$i] ? $this->y = $ypos[$i] : $this->y = 0;
            $this->start_gifmerge_process($images[$i]);
        }
        $this->fout .= "/x3b";
    }
    function start_gifmerge_process($fp) {
        if($this->mod == 'C_FILE') {
            if(!$this->fin = fopen($fp, 'rb')) {
                return;
            }
        } elseif($this->mod == 'C_MEMORY') {
            $this->ch = 0;
            $this->fin = $fp;
        }
        $this->getbytes(6);
        if(!$this->arrcmp($this->buffer, $this->gif, 3)) {
            return;
        }
        $this->getbytes(7);
        if($this->first) $this->logical_screen_descriptor = $this->buffer;
        $this->global_color_table_sizecode = $this->buffer[4] & 0x07;
        $this->global_color_table_size = 2 << $this->global_color_table_sizecode;
        if($this->buffer[4] & 0x80) {
            $this->getbytes((3 * $this->global_color_table_size));
            for($i = 0; $i < ((3 * $this->global_color_table_size)); $i++) {
                $this->global_in[$i] = $this->buffer[$i];
            }
            if($this->out_color_table_size == 0) {
                $this->out_color_table_size = $this->global_color_table_size;
                $out_color_table_sizecode = $this->global_color_table_sizecode;
                $this->global_out = $this->global_in;
            }
            if($this->global_color_table_size != $this->out_color_table_size || $this->arrcmp($this->global_out, $this->global_in, (3 * $this->global_color_table_size))) {
                $this->use_global_in = true;
            }
        }
        for($loop = true; $loop;) {
            $this->getbytes(1);
            switch($this->buffer[0]) {
                case 0x21:
                    $this->read_extension();
                    break;
                case 0x2c:
                    $this->read_image_descriptor();
                    break;
                case 0x3b:
                    $loop = false;
                break;
                default:
                    $loop = false;
            }
        }
        if($this->mod == 'C_FILE') {
            fclose($this->fin);
        }
    }
    function read_image_descriptor() {
        $this->getbytes(9);
        $head = $this->buffer;
            $this->local_color_table_flag = ($this->buffer[8] & 0x80) ? true : false;
            if($this->local_color_table_flag) {
            $sizecode = $this->buffer[8] & 0x07;
            $size = 2 << $sizecode;
            $this->getbytes(3 * $size);
            for($i = 0; $i < (3 * $size); $i++) {
                    $this->local_in[$i] = $this->buffer[$i];
                }
                if($this->out_color_table_size == 0) {
                    $this->out_color_table_size = $size;
                    $out_color_table_sizecode = $sizecode;
                for($i = 0; $i < (3 * $size); $i++)
                {
                    $this->global_out[$i] = $this->local_in[$i];
                }
                }
            }
            if($this->first) {
            $this->first = false;
            $this->fout .= "/x47/x49/x46/x38/x39/x61";
            if($this->width && $this->height) {
                $this->logical_screen_descriptor[0] = $this->width & 0xFF;
                $this->logical_screen_descriptor[1] = ($this->width & 0xFF00) >> 8;
                $this->logical_screen_descriptor[2] = $this->height & 0xFF;
                $this->logical_screen_descriptor[3] = ($this->height & 0xFF00) >> 8;
            }
            $this->logical_screen_descriptor[4] |= 0x80;
            $this->logical_screen_descriptor[5] &= 0xF0;
            $this->logical_screen_descriptor[6] |= $this->out_color_table_sizecode;
            $this->putbytes($this->logical_screen_descriptor, 7);
                $this->putbytes($this->global_out, ($this->out_color_table_size * 3));
            if($this->use_loop) {
                $ns[0] = 0x21;
                $ns[1] = 0xFF;
                $ns[2] = 0x0B;
                $ns[3] = 0x4e;
                $ns[4] = 0x45;
                $ns[5] = 0x54;
                $ns[6] = 0x53;
                $ns[7] = 0x43;
                $ns[8] = 0x41;
                $ns[9] = 0x50;
                $ns[10] = 0x45;
                $ns[11] = 0x32;
                $ns[12] = 0x2e;
                $ns[13] = 0x30;
                $ns[14] = 0x03;
                $ns[15] = 0x01;
                $ns[16] = $this->loop & 255;
                    $ns[17] = $this->loop >> 8;
                $ns[18] = 0x00;
                $this->putbytes($ns, 19);
            }
            }
          if($this->use_global_in) {
            $outtable = $this->global_in;
            $outsize = $this->global_color_table_size;
            $outsizecode = $this->global_color_table_sizecode;
        } else {
            $outtable = $this->global_out;
            $outsize = $this->out_color_table_size;
        }
        if($this->local_color_table_flag) {
            if($size == $this->out_color_table_size && !$this->arrcmp($this->local_in, $this->global_out, $size)) {
                $outtable = $global_out;
                $outsize = $this->out_color_table_size;
            } else {
                $outtable = $this->local_in;
                $outsize = $size;
                $outsizecode = $sizecode;
            }
        }
        $use_trans = false;
        if($this->transparent) {
            for($i = 0; $i < $outsize; $i++) {
                if($outtable[3 * $i] == $this->trans1 && $outtable [3 * $i + 1] == $this->trans2 && $outtable [3 * $i + 2] == $this->trans3) {
                    break;
                }
            }
            if($i < $outsize) {
                $transindex = $i;
                $use_trans = true;
            }
        }
        if($this->delay || $use_trans) {
            $this->buffer[0] = 0x21;
            $this->buffer[1] = 0xf9;
            $this->buffer[2] = 0x04;
            $this->buffer[3] = ($this->disposal << 2) + ($use_trans ? 1 : 0);
            $this->buffer[4] = $this->delay & 0xff;
            $this->buffer[5] = ($this->delay & 0xff00) >> 8;
            $this->buffer[6] = $use_trans ? $transindex : 0;
            $this->buffer[7] = 0x00;
            $this->putbytes($this->buffer,8);
        }
        $this->buffer[0] = 0x2c;
        $this->putbytes($this->buffer,1);
        $head[0] = $this->x & 0xff;
        $head[1] = ($this->x & 0xff00) >> 8;
        $head[2] = $this->y & 0xff;
        $head[3] = ($this->y & 0xff00) >> 8;
        $head[8] &= 0x40;
        if($outtable != $this->global_out) {
            $head[8] |= 0x80;
            $head[8] |= $outsizecode;
        }
        $this->putbytes($head,9);
        if($outtable != $this->global_out) {
            $this->putbytes($outtable, (3 * $outsize));
        }
        $this->getbytes(1);
        $this->putbytes($this->buffer,1);
        for(;;) {
            $this->getbytes(1);
            $this->putbytes($this->buffer,1);
            if(($u = $this->buffer[0]) == 0) {
                break;
            }
            $this->getbytes($u);
            $this->putbytes($this->buffer, $u);
            }
    }
    function read_extension() {
        $this->getbytes(1);
        switch($this->buffer[0]) {
            case 0xf9:
                    $this->getbytes(6);
                   break;
            case 0xfe:
                    for(;;) {
                    $this->getbytes(1);
                            if(($u = $this->buffer[0]) == 0) {
                            break;
                        }
                    $this->getbytes($u);
                    }
                break;
            case 0x01:
                    $this->getbytes(13);
                    for(;;) {
                    $this->getbytes(0);
                            if(($u = $this->buffer[0]) == 0) {
                            break;
                        }
                    $this->getbytes($u);
                    }
                break;
                   case 0xff:
                    $this->getbytes(9);
                    $this->getbytes(3);
                    for(;;) {
                    $this->getbytes(1);
                            if(!$this->buffer[0]) {
                                break;
                            }
                            $this->getbytes($this->buffer[0]);
                        }
                break;
            default:
                    for(;;) {
                    $this->getbytes(1);
                        if(!$this->buffer[0]) {
                            break;
                        }
                    $this->getbytes($this->buffer[0]);
                }
            }
    }
    function arrcmp($b, $s, $l) {
        for($i = 0; $i < $l; $i++) {
            if($s{$i} != $b{$i}) {
                return false;
            }
        }
        return true;
    }
    function getbytes($l) {
        for($i = 0; $i < $l; $i++) {
            if($this->mod == 'C_FILE') {
                    $bin = unpack('C*', fread($this->fin, 1));
                    $this->buffer[$i] = $bin[1];
                } elseif($this->mod == 'C_MEMORY') {
                        $bin = unpack('C*', substr($this->fin, $this->ch, 1));
                        $this->buffer[$i] = $bin[1];
                        $this->ch++;
                }
        }
        return $this->buffer;
    }
    function putbytes($s, $l) {
        for($i = 0; $i < $l; $i++) {
            $this->fout .= pack('C*', $s[$i]);
        }
    }
    function getAnimation() {
        return $this->fout;
    }
}
?>

(0)

相关推荐

  • PHP生成Gif图片验证码

    先看效果图  字体及字体文件的路径需要在类中$FontFilePath及$FontFileName中设置.如: 复制代码 代码如下: private static $FontFilePath = "static/font/"; //相对地本代码文件的位置private static $FontFileName = array("3.ttf");// array("1.ttf", "2.ttf", "3.ttf&quo

  • PHP支持多种格式图片上传(支持jpg、png、gif)

    此处一次支持上传2个图片,上传后生成原图和质量较差的图,原图用于保存质量高的图片,质量差的图用于网页显示. PHP Code 复制代码 代码如下: <?php include_once("db.php"); include_once("dbinfo.php"); $connector = new nmdb($host, $username, $password); $connector -> select_db($database); $work_gro

  • 完美实现GIF动画缩略图的php代码

    下面通过一个取自CS警匪游戏的GIF动画来说明问题: GIF动画图片:old.gif 为了让问题更加清晰,我们先还原动画各帧: 选择一:用PHP中的Imagick模块: 复制代码 代码如下: <?php $image = new Imagick('old.gif'); $i = 0; foreach ($image as $frame) { $frame->writeImage('old_' . $i++ . '.gif'); } ?> 选择二:用ImageMagick提供的conver

  • php生成gif动画的方法

    首先需要确认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 $

  • PHP实现GIF图片验证码

    这是一个用PHP生成GIF动画来实现动态图片验证码的程序,非常实用,是php用户注册登录界面经常需要用到的验证码程序,有需要GIF动态图片验证码功能的朋友可以收藏一下. 第一步:创建ImageCode.php文件,验证码生成函数代码如下: <?php /** * ImageCode 生成GIF图片验证 * @param $string 字符串 * @param $width 宽度 * @param $height 高度 * */ function ImageCode($string = '',

  • php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串

    数据库脚本: -- -------------------------------------------------------- -- -- 表的结构 `highot_attachment` -- 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `highot_attachment` ( `id` int(11) NOT NULL auto_increment, `phone_number_id` int(11) NOT NULL COMMENT 'phone_n

  • 让你的PHP同时支持GIF、png、JPEG

    让你的PHP同时支持GIF.png.JPEG 在RedHat6.2按php的manual编译安装,发现只能处理GIF图像,不能处理JPEG图像.后来知道PHP处理图像,使用了GD库,而GD库开始时是支持GIF的,但由于GIF使用了有版权争议的LZW算法,会引起法律问题,于是从GD-1.6开始,GD库不再支持GIF,改为支持更好的,无版权争议的PNG.而我现在希望同时支持GIF,PNG和JPEG. 1. Jpeg6b的安装 RedHat6.2中已经有了RPM包,我们也就不需要去费劲编译了.   放

  • PHP之生成GIF动画的实现方法

    代码如下所示: 复制代码 代码如下: <?class GifMerge {     var $ver            = '1.1';     var $dly            = 50;     var $mod            = 'C_FILE';     var $first            = true;     var $use_loop            = false;     var $transparent        = false;    

  • 用PHP 快速生成 Flash 动画的方法

    使用 Ming 库动态构建 Flash 动画 Rich Internet Application 是 Web 2.0 中的新时髦词,并且就 Web 2.0 的实质而言,一个关键组件就是 Adobe Flash.了解如何将 Flash 动画集成到应用程序中,并使用 Ming 库动态生成 Flash 动画. Web 2.0 引入了 Rich Internet Application.但 Rich Internet Application 的含义是什么?通常,它意味着向应用程序中添加具有高度响应能力的

  • Python使用Matplotlib实现雨点图动画效果的方法

    本文实例讲述了Python使用Matplotlib实现雨点图动画效果的方法.分享给大家供大家参考,具体如下: 关键点 win10安装ffmpeg animation函数使用 update函数 win10安装ffmpeg 因为最后要将动画图保存为.mp4格式,要用到ffmpeg,去官网下载,我az下载的是windows64bit static版本的,下载后解压到软件安装常用路径,并将ffmpeg路径添加到环境变量(这个方法在最后没用,但还是添加一下) animationa函数 准确来说是anima

  • iOS使用xib手动实现动画效果的方法

    今天在做项目的时候,项目使用的是xib做的,页面中需要有个动画效果,使用UIView动画如下图: 想要改变视图的宽度来实现动画效果,将这条约束拖到ViewController成为属性 使用如下方法,发现不能进行动画效果: 但是发现没有相关的动画效果.最后发现使用xib动画和普通的动画不太一样,需要如下操作才能成功实现动画: 两个重要的注意事项: 您需要调用 layoutIfNeeded 动画块内.苹果公司其实建议你称之为一次之前要确保所有挂起的布局操作已完成的动画块 您需要调用它专门在父视图上

  • 使用veloticy-ui生成文字动画效果

    前言 最近要实现一个类似文字波浪线的效果,使用了velocity-ui这个动画库,第一个感觉就是使用简单,代码量少,性能优异,在此简单介绍一下使用方法,并实现一个看上去不错的动画. 具体使用方法可以点击这里 基本使用 要使用 velocity-ui 需要先引入velocity,其中velocity可以是依赖jquery,也可以不依赖jquery,具体看一下下面就行了 //不依赖jquery,第一个参数为原生js的dom选择器 Velocity(document.getElementById("d

  • Python matplotlib包和gif包生成gif动画实战对比

    目录 前言 gif包概述 动画原理 gif包解读 options类 frames函数 save函数 gif包生成gif动画实践 以心形曲线为例比较gif包和animation模块实现动画的差异 gif包的实现方式 比较结果 总结 前言 使用matplotlib生成gif动画的方法有很多,一般常规使用matplotlib的animation模块的FuncAnimation函数实现. 在matplotlib官网看到了第三方动画包gif的介绍. gif包概述 gif包是支持 Altair, matpl

  • 详解ZXing-core生成二维码的方法并解析

    二维码无处不在,扫一扫有礼品哦,现在二维码这么流行,想必大家不是很清楚二维码是怎么生成的吧,现在小编通过给大家分享本文帮助大家学习二维码生成的方法. 其实主要是利用goggle发布的jar来使用的此功能. 1.二维码的生成 将Zxing-core.jar 包加入到classpath下. 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类拷贝到源码中,这里我将该类的源码贴上,可以直接使用. 直接可以生成二维码的代码 public void test

  • Android开发之背景动画简单实现方法

    本文实例讲述了Android开发之背景动画简单实现方法.分享给大家供大家参考,具体如下: 1.先创建动画层,有三张图片 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@draw

  • python 生成器生成杨辉三角的方法(必看)

    用Python写趣味程序感觉屌屌的,停不下来 #生成器生成展示杨辉三角 #原理是在一个2维数组里展示杨辉三角,空的地方用0,输出时,转化为' ' def yang(line): n,leng=0,2*line - 1 f_list = list(range(leng+2)) #预先分配,insert初始胡会拖慢速度,最底下一行,左右也有1个空格 #全部初始化为0 for i,v in enumerate(f_list): f_list[v] = 0 ZEROLIST = f_list[:] #预

  • 使用JSONObject生成和解析json的方法

    1. json数据类型 类型 描述 Number 数字型 String 字符串型 Boolean 布尔型 Array 数组 Object 对象 null 空值 (1)json中不区分整数.小数等类型,而统一使用Number来存储数字. (2)Array表示数组,以中括号"[]"括起来,元素之间以逗号分隔,元素可以为任意类型. (3)Object表示对象,类似于C语言中的结构体,以花括号"{}"括起来,其元素要求为键值对,key必须为String类型的,而value则

随机推荐