首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 產生 GIF 動畫完整教學:GIFEncoder 類別、合成幀與程式繪圖兩大實戰範例

     編輯:PHP 綜合知識

前置需求

  • PHP GD 擴展已啟用 (php -m | grep gd)
  • 若合成現成圖片:將幀圖置於 frames/ 目錄

核心類別:GIFEncoder.class.php

此類別封裝 GIF89a 格式組裝邏輯,支援:

  • 多幀合成 (url 或 bin 模式)
  • 循環次數、延遲時間、處置方式
  • 透明色設定 (RGB)
  • 全域/區域調色盤比較最佳化
// 關鍵方法簽名
class GIFEncoder {
    public function __construct(
        array $GIF_src,      // 幀來源:檔案路徑陣列或二進位字串陣列
        array $GIF_dly,      // 每幀延遲 (百分之一秒,100=1秒)
        int   $GIF_lop,      // 循環次數 (0=無限)
        int   $GIF_dis,      // 處置方式 (0=無, 1=不處置, 2=還原背景, 3=還原前一幀)
        int   $GIF_red,      // 透明色 R (-1=無)
        int   $GIF_grn,      // 透明色 G
        int   $GIF_blu,      // 透明色 B
        string $GIF_mod      // 'url' 或 'bin'
    ) {}
    public function GetAnimation(): string {} // 回傳二進位 GIF 資料
}

範例一:合成現有幀圖片

GetAnimation();

範例二:程式繪圖產生彈球動畫

 $gw) { $xv = -$xv; $x = $gw - ($x - $gw); }
    elseif ($x < 0) { $xv = -$xv; $x = -$x; }
    if ($y > $gh) { $yv = -$yv; $y = $gh - ($y - $gh); }
    elseif ($y < 0) { $yv = -$yv; $y = -$y; }
    $path[] = [$x,$y];
} while ($x !== $path[0][0] || $y !== $path[0][1]);

$framesBin = [];
foreach ($path as $frame) {
    $im = imagecreate($w, $h);
    $black = imagecolorallocate($im, 0,0,0);
    $white = imagecolorallocate($im, 255,255,255);
    $red   = imagecolorallocate($im, 255,0,0);
    
    // 左邊板
    $py = min($frame[1], $h - $pad*3);
    imagefilledrectangle($im, 0, $py, $pad, $py+$pad*3, $white);
    // 右邊板
    imagefilledrectangle($im, $w-$pad, 0, $w, $h, $red);
    // 球
    imagefilledrectangle($im, $pad+$frame[0], $frame[1], $pad+$frame[0]+$ball, $frame[1]+$ball, $white);
    
    imagegif($im);
    $framesBin[] = ob_get_clean(); // 取得二進位並清空緩衝
    imagedestroy($im);
}

$gif = new GIFEncoder($framesBin, array_fill(0, count($framesBin), 10), 0, 2, 0, 0, 1, 'bin');
header('Content-Type: image/gif');
echo $gif->GetAnimation();

關鍵參數調教指南

參數建議值影響
延遲 $GIF_dly10~20 (0.1~0.2秒)太小檔案大、太大卡頓
循環 $GIF_lop0 (無限)廣告建議 3~5 循環避免干擾
處置 $GIF_dis2 (還原背景)透明背景動畫必設
透明色背景主色調消除鋸齒白邊

效能與替代方案

  • GD 限制:只支援 256 色調色盤,照片級動畫品質差
  • 大量幀/高解析度:改用 ffmpeg -i frame_%04d.png -vf "fps=10,scale=320:-1:flags=lanczos" out.gif
  • 現代替代:WebP 動畫 (imagewebp PHP 7.0+)、APNG、CSS/JS 前端動畫
  • Composer 套件:syahrul/gif-encoder、kornrunner/gifencoder (更現代 OOP 介面)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved