php生成gif动画的方法_php技巧

首先需要确认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生成gif方法
, php生成gif
gif动画生成
php生成gif动画、php生成gif动画 源码、php生成gif动画 2016、在线生成gif动画、ps生成gif动画,以便于您获取更多的相关知识。

时间: 2024-08-18 18:03:36

php生成gif动画的方法_php技巧的相关文章

用PHP 快速生成 Flash 动画的方法_php基础

使用 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 的含义是什么?通常,它意味着向应用程序中添加具有高度响应能力的

php实现根据字符串生成对应数组的方法_php技巧

本文实例讲述了php实现根据字符串生成对应数组的方法,是比较实用的技巧.分享给大家供大家参考.具体方法如下: 先看看如下示例: <?php $config = array( 'project|page|index' => 'content', 'project|page|nav' => array( array( 'image' => '1.jpg', 'name' => 'home' ), array( 'image' => '2.jpg', 'name' =>

php判断GIF图片是否为动画的方法_php技巧

本文介绍了PHP判断GIF图片是动画的方法,具体步骤如下: 首先,gif动画是gif89格式的,发现文件开头是gif89.但是很多透明图片也是用的gif89格式, GOOGLE到的:可以检查文件中是否包含:chr(0×21).chr(0xff).chr(0×0b).'NETSCAPE2.0' chr(0×21).chr(0xff) 是gif图片中扩展功能段的标头,'NETSCAPE2.0'是扩展功能执行的程序名 程序代码如下: <?php function check($image){ $con

PHP实现获取并生成数据库字典的方法_php技巧

本文实例讲述了PHP实现获取并生成数据库字典的方法.分享给大家供大家参考,具体如下: <?php /** * 生成mysql数据字典 */ header("Content-type:text/html;charset=utf-8"); // 配置数据库 $database = array(); $database['DB_HOST'] = 'localhost'; $database['DB_NAME'] = 'test'; $database['DB_USER'] = 'roo

PHP使用ob_start生成html页面的方法_php技巧

本文实例讲述了PHP使用ob_start生成html页面的方法.分享给大家供大家参考.具体方法分析如下: ob_start([string output_callback])- 打开输出缓冲区 所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息. ob_end_flush - 结束(发送)输出缓冲区的内容,关闭输出缓冲区 使用output control 函数可以让自由控制脚本中数据的输出,这在我们想在header之前输出时很有用. 复制代码 代码如

PHP读取CURL模拟登录时生成Cookie文件的方法_php技巧

本文实例讲述了PHP读取CURL模拟登录时生成Cookie文件的方法.分享给大家供大家参考.具体实现方法如下: 在使用PHP中的CURL模拟登录时会保存一个Cookie文件,例如下面的代码 复制代码 代码如下: $login_url = 'XXX';    $post_fields['email'] = 'XXXX';  $post_fields['password'] = 'XXXX';  $post_fields['origURL'] = 'XXX';  $post_fields['doma

php生成RSS订阅的方法_php技巧

本文实例讲述了php生成RSS订阅的方法.分享给大家供大家参考.具体分析如下: RSS(简易信息聚合,也叫聚合内容)是一种描述和同步网站内容的格式.RSS可以是以下三个解释的其中一个: Really Simple Syndication:RDF (Resource Description Framework) Site Summary: Rich Site Summary.但其实这三个解释都是指同一种Syndication的技术.RSS目前广泛用于网上新闻频道,blog和wiki.使用RSS订阅

php实现按指定大小等比缩放生成上传图片缩略图的方法_php技巧

本文实例讲述了php实现按指定大小等比缩放生成上传图片缩略图的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /**  * *  *等比缩放  * @param unknown_type $srcImage   源图片路径  * @param unknown_type $toFile     目标图片路径  * @param unknown_type $maxWidth   最大宽  * @param unknown_type $maxHeight  最大高  * @par

PHP生成plist数据的方法_php技巧

本文实例讲述了PHP生成plist数据的方法.分享给大家供大家参考.具体如下: 这段代码实现PHP数组转换为苹果plist XML或文本格式 <?PHP /** * PropertyList class * Implements writing Apple Property List (.plist) XML and text files from an array. * * @author Jesus A. Alvarez <zydeco@namedfork.net> */ funct