一個過大而無法上傳、嵌入或傳送的 GIF,幾乎都是檔案大小的問題,而非影格品質的問題,實際的變通做法就是不要再嘗試分享完整動畫,而是改將各個可見的影格單獨取出為 PNG,這樣才能真正派上用場。大多數聊天平台、社群網路、電子郵件用戶端以及內容管理系統,都會公告明確的上限,在過大的 GIF 離開你的裝置之前就會直接拒絕。Discord 的上限大約是 10 MB,X/Twitter 在網頁上接受約 15 MB,Slack 在超過 2 MB 時會發出警告,許多 CMS 上傳功能則會悄悄地把超過數 MB 的檔案重新調整大小。一個高解析度、會動的 GIF——例如動態貼圖、螢幕錄製示範或 UI 原型——很容易在幾秒鐘內就突破這些上限,因為這個格式會把每個可見影格連同各自的調色盤與完整畫布資料一起儲存,所以檔案大小會隨著寬度與影格數一起膨脹。你一開始真正需要的往往也不是那個動畫本身,你通常只想要一張靜態圖、一格分鏡面板,或一個重新組合後的較小版本——而這些正是先把 GIF 拆成各個可見的 PNG 影格就能取得的東西。

gif too large
GIF 太大無法傳送?把影格取出為 PNG

實務上「GIF 太大」通常代表什麼

大多數搜尋「gif too large」的人,其實不是在問 GIF 格式是什麼,而是在問為什麼某個特定檔案會被拒絕,以及他們能怎麼處理。「太大的 GIF」可能代表三種不同的情況:

  • 以 MB 為單位的檔案大小。這是幾乎每個平台都會優先強制執行的一道關卡。Slack、Discord、X/Twitter、電子郵件閘道以及 CMS 上傳器,對於動畫 GIF 都會在 2 MB 到 15 MB 之間畫下一條明確的線。
  • 畫布尺寸。有些應用程式會拒絕寬度或高度超過其顯示容器的 GIF。1920×1080 的動畫在桌面聊天視窗中沒問題,但在許多手機上傳功能中會被縮小。
  • 影格數。少數社群工具會對超過固定影格數的檔案發出警告或拒絕,通常是在 200–300 這個區間,因為龐大的影格數會佔用渲染流程,並在檢視者的裝置上造成記憶體用量飆升。

關鍵在於,GIF 格式在這三個面向的效率都異常低落。MP4 或 WebM 只儲存影格之間變動的部分,動畫 GIF 卻幾乎會為每個影格各自存下一張幾近完整的圖片,而且每個影格最多只能用 256 色的調色盤。這就是為什麼一段五秒鐘的螢幕錄製可以輕鬆達到 10–15 MB、畫面上其實沒什麼激烈變動,而一個 480 像素見方、一秒鐘的反應貼圖,仍可能撞上許多聊天應用程式強制執行的 5 MB 上限。

為什麼把影格取出往往是正確的選擇

當一個 GIF 大到無法使用時,第一個直覺反應就是更積極地壓縮它——降低色彩數、縮小畫布、把影格率砍半。這些技巧確實有幫助,但也會破壞你原本喜歡的動畫。另一條路則是承認:你可能根本不需要那個動畫。

有幾種實際的工作流程,只需要從過大的 GIF 中取出靜態畫面:

  • 用於 Slack 表情符號包或大頭貼欄位的單張反應影格。
  • 用於文件分鏡的三個關鍵面板。
  • 從一張動態貼圖中取出的招牌姿勢,作為縮圖或主視覺圖。
  • 若干張中間影格,方便疊進不同的設計中。
  • 用於完全不支援動畫的電子郵件用戶端的扁平 PNG 備援。

如果你的任務符合其中任何一項,使用 GIF Splitter 把 GIF 拆成各個可見的影格、再下載你需要的靜態畫面,會比硬跟這個格式對抗來得快。你不需要重新編碼任何東西,只要挑出能用的瞬間即可。當原本的 GIF 形狀與它必須去的地方不相容時,這種拆解的方式也同樣能勝任。例如,一個必須放進方形大頭貼欄位的垂直貼圖 GIF,可以變成那個關鍵瞬間的一張乾淨方形 PNG。

如何從過大的 GIF 中取出影格

整個取出流程都在你的瀏覽器中完成。不會上傳任何檔案、不需要帳號、也不涉及伺服器端的排隊。請在 GIF Splitter 頁面上依照下列步驟操作。

  1. 選擇一個上限 20 MB 的動畫 GIF。開啟頁面,使用檔案選擇器挑選你的 GIF。超出大小、尺寸、像素或影格數上限的檔案,會在第一步就以清楚的訊息被拒絕,因此不會產生任何部分影格清單。
  2. 選擇 Extract PNG frames(取出 PNG 影格),然後等待本機合成程序完成。頁面會在你的瀏覽器中以區塊為單位讀取 GIF,並把每個可見的動畫影格繪製到一個完整的邏輯畫布上。在這個步驟中,沒有任何資料會離開你的裝置。
  3. 檢視帶有編號的預覽,並下載你需要的完整 PNG 影格。每張預覽會顯示影格編號、以像素為單位的畫布大小,以及以毫秒為單位的解碼延遲時間。點擊任何下載連結,就能把該張 PNG 儲存到你的裝置上。

輸出的檔名會沿用來源檔名加上以零填補的影格編號,因此一個名為 sticker.gif 的檔案會輸出為 sticker-frame-01.png、sticker-frame-02.png,依此類推。零填補的設計能在你於檔案管理員中排序、或把影格丟進編輯器時,保持影格的正確順序。這些 PNG 只會在你替換輸入檔、離開頁面或關閉分頁之前保留,請在離開頁面前下載你想保留的檔案。

每一張取出的 PNG 實際上包含了什麼

這是決定你取出的影格有用還是沒有的技術關鍵,也是大多數「GIF 轉 PNG」工具會略過不提的部分。

GIF 檔案實際上並沒有為每個影格儲存一張完整圖片。它儲存的是一連串的影像區塊,而其中許多區塊都是設計成覆蓋在先前影格之上的小矩形。有些區塊是透明的,有些會要求播放器在顯示後清除該矩形區域,有些則會要求播放器還原先前的畫布。把這些原始矩形匯出為 PNG,只會得到帶著破洞的裁切小圖——而不是你想要的靜態畫面。

面向原始 GIF 區塊(天真的工具匯出的結果)合成後的影格(分割工具匯出的結果)
畫布大小只有變動矩形的大小動畫的完整邏輯畫布
背景底層是什麼就呈現什麼,包括透明區域檢視者在該瞬間實際看到的內容
作為獨立的靜態畫面使用裁切的圖塊,在編輯器中往往會損壞在任何影像編輯器中都能順利開啟
影格時間參考匯出時遺失解碼後的延遲時間會顯示在每張預覽旁邊
Alpha 通道僅限於修補矩形的範圍在瀏覽器仍視為透明的整個畫布範圍內皆予以保留

分割工具會把每個區塊合成到目前的邏輯畫布上、在正確的時間點套用前一張影格的處置指令,然後把得到的完整可見畫布匯出為 PNG。這個頁面依賴兩個明確的瀏覽器基礎功能:CanvasRenderingContext2D.putImageData 用於繪製解碼後的像素,HTMLCanvasElement.toBlob 用於將該畫布序列化為真正的 PNG 檔。因此這個 PNG 會以一張正常且完整大小的靜態圖保存動畫的瞬間,而不是一張誤導人的修補圖。

單次取出的硬性上限

分割工具會強制執行一組嚴格的界線,以免一個看起來很小的上傳檔案讓你的瀏覽器配置數 GB 的畫布記憶體。動畫檔案在解壓縮後往往會膨脹為儲存大小的好幾倍,這就是為什麼每一道限制都訂得相當保守,而且所有與畫布相關的檢查都會在頁面開始產生 PNG 下載之前先執行。

限制數值為何重要
來源檔案大小上限 20 MB在解碼開始前擋下意外的大型上傳
畫布寬度或高度任一邊上限 4,096 像素避免一開始就配置出過大的畫布
單一影格的像素數上限 3,000,000對大多數實際的 GIF 而言是最具約束力的條件,也是每張影格輸出的上限
每次取出的影格數上限 50限制累計的修補工作量與輸出像素總和

這些限制會彼此交互影響。1920×1080 的畫布是 2,073,600 像素,離三百萬像素上限還有餘裕。2000×1500 的畫布正好是 3,000,000 像素,剛好踩在上限。4096×2160 的畫布雖然符合邊長限制,卻會產生 8,847,360 像素,遠超過上限,因此在任何 PNG 被寫出之前就會被拒絕。如果你的輸入檔未能通過任何一項檢查,你會看到清楚的訊息,而頁面也不會產生部分影格清單。

對於超過 20 MB 或包含超過 50 個影格的檔案,請先使用 GIF Optimizer 修剪來源檔,或在編輯器中把它切成兩個較小的 GIF,再分別執行。

取出影格之後該怎麼處理

PNG 落到你的電腦上之後,下一步取決於你實際需要的是什麼。

  • 用於靜態用途的單張影格(縮圖、大頭貼、簡報、文件)。下載那一張 PNG 就完成了。只要原本的動畫在該處是透明的,Alpha 通道都會被保留。
  • 重新組合成更小的動畫。使用 GIF Maker 從你真正需要的影格重新組合成一個較短、影格率較低的 GIF。這通常比硬跟一個 15 MB 的原檔對抗更理想,因為你能只保留真正重要的時間點,跳過冗長的靜態停頓。
  • 用於受限欄位的縮放靜態圖。把選定的 PNG 丟進影像縮放工具中,調整為目的端所需的精確像素框——方形大頭貼、固定寬度的縮圖,或為視網膜螢幕準備的 2× 輸出。
  • 對原檔進行視覺稽核。開啟第一張、中間一張與最後一張匯出的 PNG,並與動畫比對,特別留意那些只改動部分畫面的過場。如果看起來都沒問題,你就會得到一份乾淨的記錄,涵蓋每一個可見的狀態。

為了確保使用可靠,請把輸出清單當成一次視覺稽核,再決定是否刪除或替換來源 GIF。頁面不會永久保存已取出的影像,也不會上傳來源檔,所以任何你想保留的東西,都必須在頁面仍開啟時下載。如果你的目的端真正需要的是原本的動畫而不是靜態畫面,請在確認取出的影格看起來正確之後,再轉往縮放工具或最佳化工具。

延伸閱讀:初學者入門:將 JPG 轉換為 PNG 的快速指南。

延伸閱讀:線上將 PNG 轉成 JPG 是否安全?一份隱私層面的解析。