程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php生成gif動畫的代碼

php生成gif動畫的代碼

編輯:PHP綜合

  1. <? 
  2.  
  3. Class GIFEncoder {  
  4.         var $GIF = "GIF89a";                /* GIF header 6 bytes        */  
  5.         var $VER = "GIFEncoder V2.06";        /* Encoder version                */  
  6.  
  7.         var $BUF = Array ( );  
  8.         var $LOP =  0;  
  9.         var $DIS =  2;  
  10.         var $COL = -1;  
  11.         var $IMG = -1;  
  12.  
  13.         var $ERR = Array (  
  14.                 'ERR00' =>"Does not supported function for only one image!",  
  15.                 'ERR01' =>"Source is not a GIF image!",  
  16.                 'ERR02' =>"Unintelligible flag ",  
  17.                 'ERR03' =>"Could not make animation from animated GIF source",  
  18.         );  
  19.  
  20.         /*  
  21.         :::::::::::::::::::::::::::::::::::::::::::::::::::  
  22.         ::  
  23.         ::        GIFEncoder...  
  24.         ::  
  25.         */  
  26.         function GIFEncoder        (  
  27.                                                         $GIF_src, $GIF_dly, $GIF_lop, $GIF_dis,  
  28.                                                         $GIF_red, $GIF_grn, $GIF_blu, $GIF_mod  
  29.                                                 ) {  
  30.                 if ( ! is_array ( $GIF_src ) && ! is_array ( $GIF_tim ) ) {  
  31.                         printf        ( "%s: %s", $this->VER, $this->ERR [ 'ERR00' ] );  
  32.                         exit        ( 0 );  
  33.                 }  
  34.                 $this->LOP = ( $GIF_lop > -1 ) ? $GIF_lop : 0;  
  35.                 $this->DIS = ( $GIF_dis > -1 ) ? ( ( $GIF_dis < 3 ) ? $GIF_dis : 3 ) : 2;  
  36.                 $this->COL = ( $GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1 ) ?  
  37.                                                 ( $GIF_red | ( $GIF_grn << 8 ) | ( $GIF_blu << 16 ) ) : -1;  
  38.  
  39.                 for ( $i = 0; $i < count ( $GIF_src ); $i++ ) {  
  40.                         if ( strToLower ( $GIF_mod ) == "url" ) {  
  41.                                 $this->BUF [ ] = fread ( fopen ( $GIF_src [ $i ], "rb" ), filesize ( $GIF_src [ $i ] ) );  
  42.                         }  
  43.                         else if ( strToLower ( $GIF_mod ) == "bin" ) {  
  44.                                 $this->BUF [ ] = $GIF_src [ $i ];  
  45.                         }  
  46.                         else {  
  47.                                 printf        ( "%s: %s ( %s )!", $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod );  
  48.                                 exit        ( 0 );  
  49.                         }  
  50.                         if ( substr ( $this->BUF [ $i ], 0, 6 ) != "GIF87a" && substr ( $this->BUF [ $i ], 0, 6 ) != "GIF89a" ) {  
  51.                                 printf        ( "%s: %d %s", $this->VER, $i, $this->ERR [ 'ERR01' ] );  
  52.                                 exit        ( 0 );  
  53.                         }  
  54.                         for ( $j = ( 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) ), $k = TRUE; $k; $j++ ) {  
  55.                                 switch ( $this->BUF [ $i ] { $j } ) {  
  56.                                         case "!":  
  57.                                                 if ( ( substr ( $this->BUF [ $i ], ( $j + 3 ), 8 ) ) == "NETSCAPE" ) {  
  58.                                                         printf        ( "%s: %s ( %s source )!", $this->VER, $this->ERR [ 'ERR03' ], ( $i + 1 ) );  
  59.                                                         exit        ( 0 );  
  60.                                                 }  
  61.                                                 break;  
  62.                                         case ";":  
  63.                                                 $k = FALSE;  
  64.                                                 break;  
  65.                                 }  
  66.                         }  
  67.                 }  
  68.                 GIFEncoder::GIFAddHeader ( );  
  69.                 for ( $i = 0; $i < count ( $this->BUF ); $i++ ) {  
  70.                         GIFEncoder::GIFAddFrames ( $i, $GIF_dly [ $i ] );  
  71.                 }  
  72.                 GIFEncoder::GIFAddFooter ( );  
  73.         }  
  74.         /*  
  75.         :::::::::::::::::::::::::::::::::::::::::::::::::::  
  76.         ::  
  77.         ::        GIFAddHeader...  
  78.         ::  
  79.         */  
  80.         function GIFAddHeader ( ) {  
  81.                 $cmap = 0;  
  82.  
  83.                 if ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x80 ) {  
  84.                         $cmap = 3 * ( 2 << ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 ) );  
  85.  
  86.                         $this->GIF .= substr ( $this->BUF [ 0 ], 6, 7                );  
  87.                         $this->GIF .= substr ( $this->BUF [ 0 ], 13, $cmap        );  
  88.                         $this->GIF .= "!\377\13NETSCAPE2.0\3\1" . GIFEncoder::GIFWord ( $this->LOP ) . "\0";  
  89.                 }  
  90.         }  
  91.         /*  
  92.         :::::::::::::::::::::::::::::::::::::::::::::::::::  
  93.         ::  
  94.         ::        GIFAddFrames...  
  95.         ::  
  96.         */  
  97.         function GIFAddFrames ( $i, $d ) {  
  98.  
  99.                 $Locals_str = 13 + 3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) );  
  100.  
  101.                 $Locals_end = strlen ( $this->BUF [ $i ] ) - $Locals_str - 1;  
  102.                 $Locals_tmp = substr ( $this->BUF [ $i ], $Locals_str, $Locals_end );  
  103.  
  104.                 $Global_len = 2 << ( ord ( $this->BUF [ 0  ] { 10 } ) & 0x07 );  
  105.                 $Locals_len = 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );  
  106.  
  107.                 $Global_rgb = substr ( $this->BUF [ 0  ], 13,  
  108.                                                         3 * ( 2 << ( ord ( $this->BUF [ 0  ] { 10 } ) & 0x07 ) ) );  
  109.                 $Locals_rgb = substr ( $this->BUF [ $i ], 13,  
  110.                                                         3 * ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ) );  
  111.  
  112.                 $Locals_ext = "!\xF9\x04" . chr ( ( $this->DIS << 2 ) + 0 ) .  
  113.                                                 chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . "\x0\x0";  
  114.  
  115.                 if ( $this->COL > -1 && ord ( $this->BUF [ $i ] { 10 } ) & 0x80 ) {  
  116.                         for ( $j = 0; $j < ( 2 << ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 ) ); $j++ ) {  
  117.                                 if        (  
  118.                                                 ord ( $Locals_rgb { 3 * $j + 0 } ) == ( $this->COL >>  0 ) & 0xFF &&  
  119.                                                 ord ( $Locals_rgb { 3 * $j + 1 } ) == ( $this->COL >>  8 ) & 0xFF &&  
  120.                                                 ord ( $Locals_rgb { 3 * $j + 2 } ) == ( $this->COL >> 16 ) & 0xFF  
  121.                                         ) {  
  122.                                         $Locals_ext = "!\xF9\x04" . chr ( ( $this->DIS << 2 ) + 1 ) .  
  123.                                                                         chr ( ( $d >> 0 ) & 0xFF ) . chr ( ( $d >> 8 ) & 0xFF ) . chr ( $j ) . "\x0";  
  124.                                         break;  
  125.                                 }  
  126.                         }  
  127.                 }  
  128.                 switch ( $Locals_tmp { 0 } ) {  
  129.                         case "!":  
  130.                                 $Locals_img = substr ( $Locals_tmp, 8, 10 );  
  131.                                 $Locals_tmp = substr ( $Locals_tmp, 18, strlen ( $Locals_tmp ) - 18 );  
  132.                                 break;  
  133.                         case ",":  
  134.                                 $Locals_img = substr ( $Locals_tmp, 0, 10 );  
  135.                                 $Locals_tmp = substr ( $Locals_tmp, 10, strlen ( $Locals_tmp ) - 10 );  
  136.                                 break;  
  137.                 }  
  138.                 if ( ord ( $this->BUF [ $i ] { 10 } ) & 0x80 && $this->IMG > -1 ) {  
  139.                         if ( $Global_len == $Locals_len ) {  
  140.                                 if ( GIFEncoder::GIFBlockCompare ( $Global_rgb, $Locals_rgb, $Global_len ) ) {  
  141.                                         $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );  
  142.                                 }  
  143.                                 else {  
  144.                                         $byte  = ord ( $Locals_img { 9 } );  
  145.                                         $byte |= 0x80;  
  146.                                         $byte &= 0xF8;  
  147.                                         $byte |= ( ord ( $this->BUF [ 0 ] { 10 } ) & 0x07 );  
  148.                                         $Locals_img { 9 } = chr ( $byte );  
  149.                                         $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );  
  150.                                 }  
  151.                         }  
  152.                         else {  
  153.                                 $byte  = ord ( $Locals_img { 9 } );  
  154.                                 $byte |= 0x80;  
  155.                                 $byte &= 0xF8;  
  156.                                 $byte |= ( ord ( $this->BUF [ $i ] { 10 } ) & 0x07 );  
  157.                                 $Locals_img { 9 } = chr ( $byte );  
  158.                                 $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp );  
  159.                         }  
  160.                 }  
  161.                 else {  
  162.                         $this->GIF .= ( $Locals_ext . $Locals_img . $Locals_tmp );  
  163.                 }  
  164.                 $this->IMG  = 1;  
  165.         }  
  166.         /*  
  167.         :::::::::::::::::::::::::::::::::::::::::::::::::::  
  168.         ::  
  169.         ::        GIFAddFooter...  
  170.         ::  
  171.         */  
  172.         function GIFAddFooter ( ) {  
  173.                 $this->GIF .= ";";  
  174.         }  
  175.         /*  
  176.         :::::::::::::::::::::::::::::::::::::::::::::::::::  
  177.         ::  
  178.         ::        GIFBlockCompare...  
  179.         ::  
  180.         */  
  181.         function GIFBlockCompare ( $GlobalBlock, $LocalBlock, $Len ) {  
  182.  
  183.                 for ( $i = 0; $i < $Len; $i++ ) {  
  184.                         if        (  
  185.                                         $GlobalBlock { 3 * $i + 0 } != $LocalBlock { 3 * $i + 0 } ||  
  186.                                         $GlobalBlock { 3 * $i + 1 } != $LocalBlock { 3 * $i + 1 } ||  
  187.                                         $GlobalBlock { 3 * $i + 2 } != $LocalBlock { 3 * $i + 2 }  
  188.                                 ) {  
  189.                                         return ( 0 );  
  190.                         }  
  191.                 }  
  192.  
  193.                 return ( 1 );  
  194.         }  
  195.         /*  
  196.         :::::::::::::::::::::::::::::::::::::::::::::::::::  
  197.         ::  
  198.         ::        GIFWord...  
  199.         ::  
  200.         */  
  201.         function GIFWord ( $int ) {  
  202.  
  203.                 return ( chr ( $int & 0xFF ) . chr ( ( $int >> 8 ) & 0xFF ) );  
  204.         }  
  205.         /*  
  206.         :::::::::::::::::::::::::::::::::::::::::::::::::::  
  207.         ::  
  208.         ::        GetAnimation...  
  209.         ::  
  210.         */  
  211.         function GetAnimation ( ) {  
  212.                 return ( $this->GIF );  
  213.         }  
  214. }  
  215.  
  216.  
  217. $board_width = 60;  
  218. $board_height = 60;  
  219. $pad_width = 5;  
  220. $pad_height = 15;  
  221. $ball_size = 5;  
  222. $game_width = $board_width - $pad_width*2 - $ball_size;  
  223. $game_height = $board_height-$ball_size;  
  224.  
  225. $x = 0;  
  226. $y = rand(0,$game_height);  
  227. $xv = rand(1,10);  
  228. $yv = rand(1,10);  
  229. $pt[] = array($x,$y);  
  230. do{  
  231.         $x += $xv;  
  232.         $y += $yv;  
  233.         if($x > $game_width){  
  234.                 $xv = -1*$xv;  
  235.                 $x = $game_width - ($x-$game_width);  
  236.         }elseif($x < 0){  
  237.                 $xv = -1*$xv;  
  238.                 $x = abs($x);  
  239.         }  
  240.         if($y>$game_height){  
  241.                 $yv = -1*$yv;  
  242.                 $y = $game_height - ($y - $game_height);  
  243.         }elseif($y<0){  
  244.                 $yv = -1*$yv;  
  245.                 $y = abs($y);  
  246.         }  
  247.         $pt[] = array($x,$y);  
  248. }while($x!=$pt[0][0]||$y!=$pt[0][1]);  
  249.  
  250. $i = 0;  
  251. while(isset($pt[$i])){  
  252.         $image = imagecreate($board_width,$board_height);  
  253.         imagecolorallocate($image, 0,0,0);  
  254.         $color = imagecolorallocate($image, 255,255,255);  
  255.         $color2 = imagecolorallocate($image, 255,0,0);  
  256.           
  257.         if($pt[$i][1] + $pad_height < $board_width){  
  258.                 imagefilledrectangle($image,0,$pt[$i][1],$pad_width, $pt[$i][1]+$pad_height,$color);  
  259.         }else{  
  260.                 imagefilledrectangle($image,0,$board_width-$pad_height,$pad_width, $board_width,$color);  
  261.         }  
  262.         imagefilledrectangle($image,$board_width-$pad_width,0,$board_width, $board_height,$color2);  
  263.         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);  
  264.         //imagesetpixel($image,$pt[$i][0],$pt[$i][1],$color);  
  265.         imagegif($image);  
  266.         imagedestroy($image);  
  267.         $imagedata[] = ob_get_contents();  
  268.         ob_clean();  
  269.         ++$i;  
  270. }  
  271.  
  272. $gif = new GIFEncoder(  
  273.                             $imagedata,  
  274.                             100,  
  275.                             0,  
  276.                             2,  
  277.                             0, 0, 1,  
  278.                             "bin"  
  279.         );  
  280.           
  281. ob_start();  
  282. Header ('Content-type:image/gif');  
  283. echo $gif->GetAnimation();  
  284. ?> 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved