Heim  >  Artikel  >  Backend-Entwicklung  >  So synthetisieren oder erstellen Sie GIF-Animationen in PHP

So synthetisieren oder erstellen Sie GIF-Animationen in PHP

墨辰丷
墨辰丷Original
2018-06-06 11:44:132401Durchsuche

本篇文章主要介绍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 $DIS = 2; 
    var $COL = -1; 
    var $IMG = -1; 
 
    var $ERR = Array ( 
        &#39;ERR00&#39; =>"Does not supported function for only one image!", 
        &#39;ERR01&#39; =>"Source is not a GIF image!", 
        &#39;ERR02&#39; =>"Unintelligible flag ", 
        &#39;ERR03&#39; =>"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 [ &#39;ERR00&#39; ] ); 
            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 [ &#39;ERR02&#39; ], $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 [ &#39;ERR01&#39; ] ); 
                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 [ &#39;ERR03&#39; ], ( $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 &#39;Sources&#39; 
              int         &#39;Delay times&#39; 
              int         &#39;Animation loops&#39; 
              int         &#39;Disposal&#39; 
              int         &#39;Transparent red, green, blue colors&#39; 
              int         &#39;Source type&#39; 
            ); 
*/ 
$gif = new GIFEncoder  ( 
      $frames, 
      $framed, 
      0, 
      2, 
      0, 0, 0, 
      "url" 
    ); 
/* 
    Possibles outputs: 
    ================== 
 
    Output as GIF for browsers : 
      - Header ( &#39;Content-type:image/gif&#39; ); 
    Output as GIF for browsers with filename: 
      - Header ( &#39;Content-disposition:Attachment;filename=myanimation.gif&#39;); 
    Output as file to store into a specified file: 
      - FWrite ( FOpen ( "myanimation.gif", "wb" ), $gif->GetAnimation ( ) ); 
*/ 
Header ( &#39;Content-type:image/gif&#39; ); 
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 (&#39;Content-type:image/gif&#39;); 
echo $gif->GetAnimation(); 
?>

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP编写信息提示框的方法

PHP构造sql语句类的方法

PHP消息队列的用法及实例

Das obige ist der detaillierte Inhalt vonSo synthetisieren oder erstellen Sie GIF-Animationen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn