GIF 轉精靈表工具 — 免費、在瀏覽器內完成、不必上傳

自己做 GIF 轉精靈表
把 GIF 丟進來,換到一張可以直接進遊戲的精靈表 — 自選欄數、列數與 FPS,保留透明,下載 PNG 圖集。全程在瀏覽器裡跑,檔案不會離開你的裝置。
GIF 轉精靈表聽起來很簡單,親手做一次就知道不是。GIF 本身就是一串完整影格,帶著調色盤與逐格延遲,所以你真正需要的工具得能:解碼每一格、正確合成透明、再把这些影格排進同一張 PNG,而且排出來的網格要能用貼圖座標定址。Neta Studio 的轉換器把解碼這一步放在瀏覽器裡的 canvas 上做,檔案留在瀏覽器,不會碰到伺服器。你丟進 GIF,選好欄數、列數與 FPS,下載一張 PNG 圖集。
難的從來不是畫圖,而是調色盤、時間與網格數學。GIF 的透明是以色表索引的方式儲存,所以一格在看圖軟體裡看起來很乾淨,合成到 canvas 之後卻可能帶著黑邊或白邊。GIF 的影格延遲單位是百分之一秒,而且常常每格都不一樣;這也是天真的匯出方式會做出看了會卡的精靈表的原因。這一頁講的是真正關鍵的設定,還有我們在做這個工具時實際撞到的失敗模式。
把 GIF 轉成精靈表
轉換器就放在頁面最上面:一個拖放區、一條影格預覽列,加上四個控制項——欄數、列數、FPS,以及保留 alpha 通道的開關。檔案丟進去之後,瀏覽器會透過 GIF 解碼器為每一格建立一個 ImageBitmap,以來源尺寸畫到離屏 canvas 上,再照算好的儲存格位置 blit 進圖集 canvas。來源檔是用 File API 讀進來、放在記憶體裡的。不會有任何帶著你 GIF 的網路請求。
輸出一律是 PNG。PNG 有 8 位元 alpha 通道,這正是做角色需要的;JPEG 會把每一條柔邊壓成硬邊。如果你的 GIF 本來就沒有透明,圖集仍然是 RGBA,用不到的 alpha 位元只多佔一點檔案大小。如果 GIF 真的用了透明,解碼時必須取得套用 disposal 之後的完整影格,而不是局部更新,否則會動的元素會在整張表上拖出殘影。
精靈表要照引擎取樣的方式來排,不是照它在檔案總管裡看起來的樣子。4x4、每格 64x64 的網格就是 256x256 的貼圖,第 n 格的位置是欄 n mod 4、列 floor(n / 4)。目標引擎或著色器圖集要求 2 的次方時,就把尺寸做成 2 的次方;320x320 的表在某些路徑上會被補齊或重新取樣,精靈邊緣會糊掉。
01
把 GIF 拖進轉換器。在你動任何設定之前,影格數和來源尺寸就會先顯示出來。
02
把欄數和列數設成你要的網格。24 格動畫常用 6x4;排成單列也行,VRChat 要的就是單列。
03
FPS 設成遊戲實際播放的速率。這個值只決定精靈表上記錄的名義影格時間;輸出是靜態 PNG,真正跑的速度由引擎決定。
04
除非目標格式不支援,否則 alpha 就開著。如果預覽裡 GIF 是黑底,代表來源沒有透明索引,那個黑是真的。
05
下載 PNG,然後對一下尺寸:寬等於欄數乘影格寬,高等於列數乘影格高。

VRChat 用的 GIF 轉精靈表
VRChat 的翻頁動畫(flipbook)著色器把貼圖當成一條橫向長條讀,不是網格。你給它 6x4 的表,它只會把第一列當長條重複播,因為它的 UV 計算是假設所有影格都在同一列、影格索引只在 U 軸上前進。把欄數設成影格數、列數設成 1:24 格動畫就變成一張 24x1 的表。
長條的總寬度要做成 2 的次方。24 格、每格 64 像素的長條寬 1536 像素,不是 2 的次方;下一個能被 64 整除的尺寸是 2048,可以放到 32 格。多出來的儲存格可以填透明像素,也可以放最後一格的複本。2 的次方之所以要緊,是因為非 2 次方貼圖在上傳路徑上經過 mipmap 生成或壓縮之後,取樣可能偏移半個 texel,而只有一像素寬的精靈馬上就看得出來。
alpha 在這裡處理,在精靈表上處理,不要丟給著色器。著色器裡的 cutout 或 alpha test 是很粗的工具;GIF 抗鋸齒輪廓留下的柔邊會依門檻值決定留下還是消失,而你不會想為每一隻 avatar 調那個門檻。把 PNG 匯出成帶真 alpha、邊緣對預乘安全的形式,著色器只要取樣就好。迴圈節奏要一致:VRChat 的翻頁動畫以固定時間步進推進,所以如果你的來源 GIF 每格延遲不規則,匯出前先把它們拉平,否則動畫會用一個和原始時間不一致的等速播完。
完整的參數清單與貼圖設定,請看翻頁動畫貼圖指南。
GIF 轉影格網格(「試算表」)
會搜 gif to spreadsheet 的人,幾乎都不是要找 .xlsx。他們要的是影格網格:影格照列與欄排好,每一格都能用索引定址。會用這個字,是因為網格乍看之下很像試算表。這個工具產生的就是那個網格,而網格和精靈表是同一件事——差別只在你怎么稱呼它。真正要緊的是排列要規則:儲存格尺寸固定、欄數固定、影格順序由左到右、由上到下。
另一種有人會試的做法,是在像素繪圖軟體裡一格一格畫,疊洋蔥皮疊到動畫看起來對為止。那個流程適合自己從頭畫角色,遇到手上已經有 GIF 就很糟。像素編輯器不會讀 GIF 的逐格延遲,手動把 24 格匯進 24 個圖層,時間資訊就整個不見了。來源本來就是動畫的話,轉成網格是比較短的路。像素工具值得用的時機是在創作,不是在轉檔。
如果要手繪影格,像素藝術那幾頁講的是繪製與調色盤的部分。
影格尺寸、網格與透明背景
大多數轉換會壞在四件事上。每一件都有明確的症狀。
GIF 的透明死在調色盤上。GIF 最多只能用 256 色,透明是用調色盤索引標記的。當某一格以 disposal method 2 解碼時,某一格原本透明的地方可能會被還原成前一格的背景色。解法是每一格都合成到透明緩衝區上,而不是合成到白色上。如果預覽裡精靈周圍出現黑或灰的形狀,那就是調色盤的背景索引,而且它現在已經是實際像素了。
最後一列不滿。如果影格數是 23、你選 6 欄,會得到三列滿的,加上最後一列只有五格而不是六格。圖集高度仍然會進位到完整的一列高。如果引擎的翻頁動畫計算是假設網格是滿的,用總影格數除以欄數去推索引,迴圈尾端就會讀到空格。用透明儲存格把整張表補成完整矩形,或是把欄數減到能整除。
影格尺寸必須能整除整張表。從 320 寬的表裡取寬 64 的子矩形,剛好五欄。從 330 寬的表裡取,會得到五欄加 10 像素的餘數,而那 10 像素不是影格。兩個軸向都讓表尺寸等於影格尺寸乘上欄數(列數)。
原點差一格。貼圖 UV 通常從左下角起算,影格網格卻是從左上角開始排。如果第 0 格畫出來是最後一格,代表你的引擎把 V 反過來了。第 c 欄、第 r 列的精靈儲存格在影像座標裡是 x = c * width、y = r * height,換成翻轉的 UV 就是從 1 減掉它。
- 網格控制欄數、列數和 FPS 都是明確的輸入值。圖集尺寸一律由影格尺寸乘上網格算出來,不做猜測。
- 保留 alpha匯出的是 RGBA PNG。透明區域維持透明,包含最後一列不滿時補上的那些儲存格。
- 本機解碼GIF 在瀏覽器裡解碼。沒有上傳步驟、沒有伺服器端的佇列、不用等來回一趟。
精靈表接下來去哪
不管去哪,匯出的都是同一張 PNG;差別在引擎期待貼圖怎麼切、以及它怎麼處理 alpha。下面這份就當快速對照。
每個目標各匯出一張表,用那個目標不需要自訂著色器就能讀的網格。要同時支援兩個目標,就匯出兩張:VRChat 用橫向長條,引擎用網格。從同一個 GIF 再匯出一次,比為了两邊寫一套 UV 換算快。
| 目標 | 匯出 |
|---|---|
| Unity | 網格表、2 的次方貼圖,Sprite Mode 設 Multiple 並依儲存格尺寸做網格切割;像素藝術用 Point 濾波,要柔就用 Bilinear。匯入設定裡把 Alpha Is Transparency 打開。 |
| Godot | 網格或長條都可以,用 AtlasTexture 載入,或在 AnimatedSprite2D 裡用 SpriteFrames 資源切格。做像素就用 Nearest 濾波。影格時間來自 SpriteFrames 這份資源,不是 PNG。 |
| GameMaker | 網格表,匯入成 sprite 並把影格尺寸設成你的儲存格尺寸。影格數必須跟表完全對上;GameMaker 不會幫你把不滿的最後一列修掉。 |
| VRChat | 單一橫向長條,總寬度為 2 的次方,欄數等於影格數,列數等於 1。alpha 做在 PNG 裡,迴圈節奏統一。 |
在 3D 裡看你的精靈表動起來
大多數轉換器到 PNG 就停了,驗證的事留給你自己另外找地方做。3D game builder 會繼續往下走:你可以把一張表貼到面向鏡頭的平面上,在真實場景裡看它跑,這是唯一能回答網格與時間對不對的測試。Agent Sprite Forge 則是精靈變成有控制器的角色的地方;精靈就是角色,3D 世界是它住的地方。
The Cyclops' Island 就是這個想法的可玩示範——一個小小的 3D 場景,可以在裡面走動、在瀏覽器裡生成、用精靈當角色。把你的表丟進去,帶動示範影格的那套機制就會去取樣你的圖集。影格順序錯了,你馬上就看得出來:角色倒退走,或在迴圈尾端跳到空格。alpha 錯了,身體周圍會出現一個硬邊矩形。這些和你在引擎裡會遇到的失敗完全相同,大概五秒就能看見。
去玩玩看 The Cyclops' Island 這個可玩場景,換上你自己的圖集。
更多免費精靈工具
轉換器只是其中一塊。下面三個補上 Neta Studio 上精靈流程的其他部分,而且都在同一個瀏覽器工作階段裡跑,本機檔案處理方式也一樣。
- 精靈表製作工具把一張張影格圖合併成單一圖集。來源是一堆分開的 PNG 而不是一個 GIF、又需要規則網格時很好用。
- 精靈動畫播放器在時間軸上播放精靈表、調整影格率、不用開引擎就能檢查迴圈節奏。可以在匯出前抓到差一格的影格順序。
- 精靈資源庫網格設定、引擎匯入設定,以及各種格式反覆出現的透明陷阱,都整理成對照表與筆記。
走進它真正所屬的那個世界
精靈是一個沒有地方站的角色。最後這一步別人沒做:把你剛做好的表放進一個能讓人走動的世界裡——一座小島、一顆行星、一個下雨的街角。這個網站上每一個世界都是從一段文字描述生成,發布成一個可以直接玩的頁面。
常見問題
有沒有 ezgif 的替代方案? +
有,如果你要的正好就是 GIF 轉精靈表。ezgif 處理的是一大票格式轉換;這個工具只做一件事:解碼 GIF、把影格排成網格或長條、匯出帶你指定 alpha 的 PNG 圖集。不上傳,所以也沒有伺服器佇列。
透明會被保留下來嗎? +
會,前提是來源 GIF 真的用了透明調色盤索引。匯出的是 RGBA PNG。常見的失敗來自來源本身:很多 GIF 用的是實心背景色而不是透明,那個背景就會以實際像素出現在表上。
為什麼我的精靈表是黑底? +
GIF 調色盤的背景索引是黑色,或是影格合成到了錯的緩衝區。GIF 影格可以是局部更新,所以解碼時如果不理 disposal method,上一格的像素就會留在原地。排網格之前,先把每一格重新合成到透明 canvas 上。
欄數和列數要怎麼選? +
可以的話,欄數選能整除影格數的,這樣最後一列不會不滿。24 格動畫用 6x4 可以。要給 VRChat 用,欄數設成影格數、列數設成 1。
精靈表裡可以設影格率嗎? +
PNG 是靜態影像,不帶任何時間資訊。工具裡的 FPS 設定只是記下你預期的速率;實際播放由你的引擎或著色器決定。VRChat 的翻頁動畫以固定步進推進,匯出速率要對上它。
為什麼匯出後動畫會卡頓? +
來源 GIF 的逐格延遲可能不規則(單位是百分之一秒),而引擎是等速推進的。把延遲拉平,或是接受等速播放,把引擎速率設成平均值。
回到 3D Game Builder
31 個完成的 3D 世界、遊戲與場景全放在同一頁——每一個都能玩。
瀏覽現成的精靈表
這個資源庫裡的每一個素材都是透明、可以直接進遊戲的 PNG,而且附有當初的提示詞——精靈表資源與免費精靈表,依動作、風格與主題標籤分類。可免費瀏覽與下載。