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

PHP 完整實作:調整 GIF 動畫尺寸並保持動畫效果

     編輯:PHP 相關知識

前言

調整 GIF 動畫尺寸比單張圖片複雜,必須逐幀解碼、縮放、再重新編碼,同時保留延遲時間、透明色、處置方式等資訊。本文提供一個開箱即用的 gifresizer 類別,內含完整的 GIF 解析器、GD 縮放邏輯與編碼器,可直接整合至專案。

快速使用

require_once 'gifresizer.php';

$gr = new gifresizer();
$gr->temp_dir = 'temp_frames'; // 需可寫入權限
$gr->resize('source.gif', 'output.gif', 500, 500);

核心原理

  1. 解碼:逐位元組解析 GIF 區塊(Header、Graphics Control Extension、Image Descriptor、LZW 資料流),將每一幀存成暫存檔。
  2. 縮放:使用 GD imagecopyresized 逐幀縮放,保留透明色與調色盤。
  3. 編碼:重新組裝 Header、Application Extension (NETSCAPE2.0 循環)、Graphics Control Extension、Image Data,寫入新檔。

類別關鍵方法概覽

方法用途
resize($src, $dst, $w, $h)公開介面,執行完整流程
decode()解析原始 GIF,產生幀檔
resizeframes()呼叫 GD 縮放每一幀暫存檔
encode()將縮放後幀重新編碼為 GIF
clearframes()清除暫存幀檔

注意事項

  • 暫存目錄:$temp_dir 必須存在且可寫入(建議 0777),否則解碼失敗。
  • 記憶體:大尺寸、多幀 GIF 可能耗較多記憶體,必要時調整 memory_limit。
  • 相容性:僅支援 GIF87a/89a 標準格式,不支援 APNG 或 WebP。

完整原始碼

完整類別程式碼較長(約 600 行),已整理於 gifresizer.php,主要包含:

  • 位元組層級的 GIF 區塊解析器(get_gif_header, get_graphics_extension, get_image_block 等)
  • LZW 資料流讀取與色彩表轉移邏輯
  • GD 縮放時的透明色處理(imagecolortransparent, imagepalettecopy)
  • 編碼時的位元組組裝與新尺寸寫入 Header

完整程式碼請參考原文件,已去除除錯函式並修正部分語法相容 PHP 7/8。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved