免費轉換器 · 圖片或影片,瀏覽器內完成

圖片與影片轉 Sprite Sheet 轉換器 — PNG 影格轉遊戲圖集

製作你自己的圖片轉 sprite sheet

將一連串 PNG 影格或一段短片轉換成單一乾淨的 sprite sheet。設定欄數、列數、儲存格大小與去背。完全在瀏覽器中執行。

✦Sprite
製作圖片轉 sprite sheet

圖片轉 sprite sheet 轉換器會接收一連串 PNG 影格(或一段短片),並將其打包成單一圖集,可直接交給遊戲引擎使用。在 Neta Studio 上,轉換完全在瀏覽器中執行:沒有上傳佇列、沒有伺服器往返、沒有任何檔案離開你的裝置。你放入一個裝有編號 PNG 的資料夾或單一 MP4,設定欄數、列數、儲存格大小與去背,然後匯出 sprite sheet 及對應的 JSON manifest。

真正會出問題的地方並不是打包。而是排序(frame_10 排在 frame_2 之前)、邊距(濾波器取樣到相鄰儲存格而產生邊緣殘色),以及儲存格大小(sprite sheet 的尺寸無法被網格整除,導致最後一欄被裁切)。本頁會具體說明這幾點,另外也會說明如何從影片中切出影格,以及如何在真實的 3D 世界中檢查成果的動畫播放。

放入圖片或影片

第一個畫面只有一個放置目標與兩條分支。放入一個資料夾,或多選 PNG、WebP 或 JPG 影格,工具會將輸入視為有序的圖片序列。放入單一影片檔——瀏覽器能解碼的 MP4、WebM 或 MOV——工具會切換到擷取分支,你在此選擇取樣率,它會透過 WebCodecs 路徑擷取影格,並以隱藏的 video 元素作為後備方案。

兩條分支都會進入同一個編輯器:右側是儲存格網格,左側是設定欄,還有一個可原地逐格檢視 sprite sheet 的即時預覽。在你按下匯出之前,不會寫入任何磁碟。靜態圖片在主執行緒解碼,影片則在 worker 中解碼,因此 4K 短片仍能保持介面順暢,但 300 張的 PNG 序列在解碼時會短暫阻塞畫面繪製。

如果放入的內容被拒絕,原因幾乎總是以下三者之一:影片編碼在瀏覽器中無法解碼(MOV 中的 HEVC 很常見)、圖片尺寸不一致,或影格數量超出你所設定網格的儲存格上限。工具會指出失敗的檔案,而不是默默丟棄。

  • PNG 影格資料夾多選或資料夾拖放。以自然排序比較器排序,因此 frame_2 會排在 frame_10 之前,而不是依字典序排序。
  • 短片MP4、WebM 或 MOV。你選擇要取樣的每秒影格數;工具會自行選擇解碼路徑,並在開始前回報將擷取的影格數量。
  • 即時網格預覽當你變更欄數、列數、儲存格大小或邊距時,sprite sheet 會重新繪製。檢視預覽時會依序逐格前進。
  • 去背從角落像素進行填色去背,附容差滑桿,並可選用邊緣羽化以避免出現生硬的 1px 光暈。

如何從 PNG 影格製作 sprite sheet

排序是第一個決定,而如果你的檔名不一致,工具就可能排錯。預設比較器會將每個檔名拆成文字與數字片段再加以比較,因此 walk_0001.png … walk_0048.png 會落在正確順序,walk_1.png … walk_48.png 也一樣。如果你的影格是以時間戳或 UUID 命名,排序就是任意的——請先重新命名,或在打包前拖曳縮圖列調整順序。

將影格數量與你對該動畫的預期互相核對。12 格的待機循環與 24 格的行走循環在縮圖網格中以小尺寸檢視時看起來一模一樣。開啟預覽,檢視到最後一格,確認它正是接回第一格之前應該出現的影格——那通常是循環看起來破功的地方。

每個影格都必須有相同寬高。打包器會採用第一張圖片的尺寸,並拒絕之後任何尺寸不同的檔案。如果你的匯出工具在裁切時加上了 1px 邊框,或是以不同的錨點輸出了某個 sprite,那些影格就是異類,應該從來源修正,而不是在這裡補邊距。

1

01

將 PNG 資料夾放到工具上。影格會以自然數字順序排序;若排序有歧義,可拖曳調整。

2

02

在 Auto cell-size 面板中確認偵測到的影格尺寸。如果你的影格帶有想修剪掉的多餘透明邊界,請手動覆寫。

3

03

設定欄數與列數。48 格行走變成 8 欄 × 6 列,若你的材質頁偏好較寬的比例則可設為 12 × 4。

4

04

設定邊距。雙線性濾波用 2px 就足夠;若引擎會對圖集做 mipmap,請用 4px。

5

05

選擇背景處理方式:保留 alpha,或使用填色容差滑桿將單一純色去背。

6

06

檢視逐格預覽。依序走過每一格,確認最後一格能接回第一格。

7

07

匯出為 PNG 加上 JSON manifest。manifest 會記錄儲存格寬、儲存格高、欄數、列數、邊距,以及依 sprite sheet 順序排列的影格名稱。

PNG frames assembled into one sheet
十二個 PNG 影格進,一個圖集出。

將影片轉換成 sprite sheet

從影片擷取影格時,有一個數字決定結果是否可用:擷取率。影片通常是 24、30 或 60 fps;sprite 動畫則很少需要這麼高。一段三秒的 30 fps 短片若以 30 fps 取樣,會產生 90 格與一個不必要地龐大的圖集。同一段短片以 12 fps 取樣只產生 36 格,對大多數角色動作而言播放效果幾乎無從分辨。

請依動畫的預定播放速率來選擇擷取率,而不是依來源。如果 sprite 在遊戲中會以 12 fps 播放,就以 12 fps 擷取。如果你打算重新調整時間,就以 24 擷取,並在引擎中每隔一格丟棄——你保留了調整空間,代價是 sprite sheet 較大。

儲存格大小來自套用任何縮放之後的影片尺寸。1920×1080 的短片縮放至 480×270 會得到 480×270 的儲存格。請保持來源的長寬比;非等比例縮放會讓每個影格變形,沒有任何邊距設定能修正這點。當影片有黑邊時,請在擷取前先裁掉黑邊,而不是事後去背,因為移動中的主體可能會接觸到黑邊的顏色。

1

01

放入影片檔。工具會回報長度、來源 fps 與可解碼的尺寸。

2

02

設定擷取率(每秒影格數)。從 sprite 預定的播放速率開始。

3

03

若想要較小的儲存格,請設定輸出縮放。保持寬高比不變。

4

04

選擇時間範圍。你往往只需要較長短片中的兩秒片段。

5

05

執行擷取。工具會回報將產生的確切影格數量。

6

06

設定欄數與列數,使網格能容納擷取到的數量,接著如上所述設定邊距、去背並匯出。

來源擷取率長度儲存格
30 fps 短片30 fps2.0 秒60
30 fps 短片12 fps2.0 秒24
60 fps 短片12 fps1.5 秒18
60 fps 短片24 fps1.5 秒36

PNG 轉 sprite:透明度與邊距

保留 alpha 通道。人們回報的打包問題,多數可追溯到轉換器在匯出時將 RGBA 壓平為 RGB,這會依畫布填色讓每個透明像素變成黑色或白色。使用本工具時,匯出畫布建立時不帶不透明背景,因此已去背或預先去背的 PNG 在打包後仍保有 alpha。

邊距之所以存在,是因為材質濾波會取樣到儲存格之外。在 sprite 邊緣,雙線性或三線性濾波會讀取相鄰儲存格的像素並將其混入,產生一條 1px 的邊緣殘色,顏色會隨相鄰的 sprite 而改變。每個儲存格周圍留 2px 的透明邊距可阻止濾波器取樣到外部。邊距值會寫入 manifest,因此引擎讀取圖集時可依邊距位移 UV。

多數引擎已不再要求 sprite sheet 尺寸為 2 的次方,但在硬體上,以及假設如此的老舊流程中仍有幫助。設定欄數與列數,使(儲存格 + 2 × 邊距)× 欄數與(儲存格 + 2 × 邊距)× 列數落在 256、512、1024、2048 或 4096。如果你的網格無法整除,最後一列或最後一欄就會被裁切或填滿空白——工具會即時顯示最終 sprite sheet 尺寸,讓你在匯出前就能看出這點。

  • 保留 alpha匯出畫布預設為透明。已去背的 PNG 維持去背狀態。
  • 邊距每格 0、2、4 或 8 px 的透明間隔。會記錄於 manifest 中,以便位移 UV。
  • 2 的次方提示尺寸讀數會在 sprite sheet 接近 512、1024、2048 或 4096 時標示,讓你能微調欄數或列數以達成該尺寸。
  • 填色去背取樣四個角落像素並移除容差範圍內的像素。羽化可柔化 1px 邊緣以避免光暈。

自動偵測儲存格大小

工具會從來源讀取儲存格大小。若是圖片序列,會採用第一張成功解碼影格的尺寸;若是影片,則採用縮放後的輸出尺寸。該值會預先填入 Cell size 欄位,並用來計算預設網格,因此一資料夾的 64×64 影格會以 64×64 儲存格開啟。

當主體周圍的透明邊界大於主體時,請手動覆寫。以寬鬆邊距匯出的 sprite 會產生大多為空的儲存格,圖集也會比實際需要更大。修剪設定會找出所有影格中非透明像素的邊界框,並裁切至其聯集——不是逐格裁切,因為逐格修剪會讓 sprite 在播放時抖動。

當影格不一致時,請以另一種方式覆寫。如果序列混雜了 64×64 與 66×66,因為某次匯出加了外框,儲存格大小偵測會鎖定第一個檔案,其餘的則被縮放或拒絕。請修正來源。沒有任何儲存格大小能讓尺寸不符的影格變正確。

來源狀態偵測到的儲存格動作
一致的 64×64 PNG64×64接受並打包
一致的 128×128 但留有寬邊界128×128啟用修剪以裁切至聯集邊界框
混雜 64×64 與 66×66依第一個檔案取 64×64將尺寸異常的影格重新匯出為 64×64
1920×1080 影片縮放至 480×270480×270接受,邊距 2px,設定網格以整除 2048

在 3D 中看它動起來

sprite sheet 唯有播得出來才算正確。The Cyclops' Island 是 Neta Studio 上一個可遊玩的世界,使用了 sprite 風格的角色,也是檢查圖集動態最快的方式——帶著角色走動,觀察循環點,看看鏡頭拉遠、濾波生效時邊距殘色是否顯現。

如果你想自己建立測試,3D 遊戲建構器讓你將匯出的 PNG 與其 manifest 放入場景,並以計時器驅動 UV 位移。將影格時間設為你選擇的擷取率,動畫就會以你預期的速度播放。如果在這裡看起來不對,在你的引擎裡也會不對,而原因幾乎總是 manifest 中的儲存格或邊距值。

Mini World 是較小的沙盒,適合你只想要一個平面放上 sprite sheet,搭配可環繞的鏡頭,這通常已足以看出 sprite 邊緣的去背瑕疵。

  • The Cyclops' Island內含動畫角色的可遊玩世界。載入它,在真實場景中觀看 sprite sheet 播放,而不是在預覽小工具裡。
  • 3D 遊戲建構器將 sprite sheet 與 manifest 放入場景,以計時器驅動 UV 位移,並驗證影格時間與你的擷取率相符。
  • Mini World一個平面與環繞鏡頭。近距離檢查邊緣、去背與邊距最快的方式。

更多免費工具

本轉換器與另外三個工具並列,它們共用同一個編輯器與匯出格式。在其中一個製作的 sprite sheet 可直接在另一個開啟,無需轉換。

GIF 轉 sprite sheet 接收動畫 GIF 並擷取其影格。GIF 的影格延遲是逐格定義的,因此工具會讀取這些延遲並回報 sprite sheet 的實際播放速率,而不是假設固定值。Sprite sheet 轉 GIF 則是反方向:在儲存格上選擇時間範圍,以指定的影格延遲匯出動畫 GIF,適合在不想附上 PNG 的情況下分享循環動畫。Sprite 動畫器接收 sprite sheet 與 manifest,在畫布中播放,並提供速度、方向與循環控制,讓你可在投入引擎前檢查影格時間。

每個工具匯出的 manifest 結構相同。儲存格寬、儲存格高、欄數、列數、邊距,以及有序的影格清單——因此從影片擷取器開始、在動畫器結束的 sprite sheet,全程帶著相同的數值。

  • GIF 轉 sprite sheet從動畫 GIF 擷取影格,並讀取逐格延遲以回報實際播放速率。
  • Sprite sheet 轉 GIF將選定的儲存格範圍以可設定的影格延遲匯出為動畫 GIF。
  • Sprite 動畫器在畫布中播放 sprite sheet 與 manifest,提供速度、方向與循環控制以檢查時間。
The Cyclops' Island — 一條從影片到 sprite sheet、一路做到遊戲的流程。

走進它所屬的世界

sprite 是一個無處可站的角色。最後這一步是其他人沒有提供的:把你剛做好的 sprite sheet 放進一個有人能走動的世界——一座小島、一顆行星、一個下雨的街角。本站的每個世界都是由一段文字描述生成,並發布為可直接遊玩的頁面。

返回 3D 遊戲建構器

全部 31 個完成的 3D 世界、遊戲與場景都在同一頁——每一個都可遊玩。

平台:Neta Studio頁面:圖片與影片轉 Sprite Sheet 轉換器接著閱讀:/explore/tool/gif-to-sprite-sheet · /explore/tool/sprite-sheet-to-gif · /explore/tool/sprite-sheet-maker

瀏覽現成的 sprite sheet

本資源庫中的每一項素材都是透明、可直接用於遊戲的 PNG,並附有記錄下來的提示詞——Sprite sheet resources 與 Free sprite sheets,依動作、風格與主題標記。可免費瀏覽與下載。

×