這個頁面的程式碼沒跑起來。

直接從資料夾裡開啟 index.html,瀏覽器會攔下 JavaScript 模組,於是你選好一個 GIF 之後,頁面不會有任何反應。改用 http 把這個資料夾提供出去:

powershell -ExecutionPolicy Bypass -File serve.ps1

然後開啟 http://localhost:8080/。

GIF 拆幀 — 每一幀存成一張 PNG

每一幀都單獨存成一張 PNG。

語言: 繁體中文
檢視原始碼
你的 GIF 不會上傳。這裡根本沒有伺服器。

GIF 的讀取、解壓和繪製都由你自己的瀏覽器完成,每一張 PNG 也是在這臺機器的記憶體裡編碼出來的。就算這裡有什麼東西想把動圖送走,頁面的另一端也根本沒有伺服器可以接。

即時檢查: 檢查中…

離線: 檢查中…

不用信我們說的。開啟開發者工具,盯著「網路」面板,拆一個 GIF 試試。沒有哪個請求帶上圖片、某一幀,或者檔名。嫌麻煩就直接拔掉網線,照樣拆。

1 選一個 GIF

2 幀怎麼出

每隔多少幀留一幀 不要全部,改成每兩幀或每五幀取一幀,適合做一覽圖或者處理長錄影。

時間清單 每一幀停留了多久、放在什麼位置。一堆 PNG 擺在資料夾裡帶不走這些。

幀

3 拆出來的幀

以 Markdown 檢視

GIF 拆幀的步驟

  1. 選一個 GIF。拖到選擇框裡,或者自己找出來。瀏覽器直接從磁碟上讀,頁面會告訴你它看到了什麼:尺寸、幀數、播多久、循環幾遍。
  2. 決定每張 PNG 裡放什麼。看上去的那一幀是絕大多數人要的,也就是動畫在那一刻的整幅畫面。只要這一幀真正存下的畫素是檔案裡實際帶著的那塊補丁,保持它自己的大小和位置。GIF 之所以小就是靠它,而它並不是動畫看起來的樣子。
  3. 決定透明怎麼處理。PNG 能原樣保留透明,這是誠實的預設值。要是這些幀要拿去的地方根本不認透明、會把它變成黑色,那就改成填一個顏色。
  4. 挑出你要的幀。預設全要。「每兩幀留一幀」用來給長錄影瘦身,網格裡的勾選框比它優先。編號從來不會變,所以不管你把鄰居丟掉多少,第 42 幀還是第 42 幀。
  5. 下載。從網格裡一幀一幀存,或者打包成一個 ZIP 一次拿走,這樣儲存提示只彈一次,而不是幾百次。ZIP 裡可以放一個 frames.txt,寫明每一幀停留了多久,這是一堆 PNG 擺在資料夾裡唯一說不出來的事。

說得更細的版本

怎麼把 GIF 拆成一幀一幀 把動圖 GIF 的每一幀存成 PNG:為什麼有些幀只是畫面裡的一小塊、透明會怎麼樣,以及怎麼把時間留住,好把它再拼回去。

常見問題

我的 GIF 會被傳到哪裡去嗎?

不會。檔案的讀取、解壓和繪製都由你自己的瀏覽器在你自己的硬體上完成,每張 PNG 也是在這裡的記憶體裡編碼的。這個工具沒有服務端,頁面的 Content-Security-Policy 裡寫著它允許聯絡的每一個地址,沒有一個屬於本站。拔掉網線,它照樣拆 GIF。

為什麼有一幀看起來像畫面的一小塊?

因為檔案裡存的就是那樣。GIF 是一張起始畫面加上後面一連串補丁:後面每一幀只存變化的那個矩形,螢幕上其餘部分是前面幾幀留在那裡的。一個人對著不動的牆說話,於是每幀存的是一張臉,而不是一整幅畫面,這個格式不至於大得離譜,全靠這一點。

你現在看到這個,是因為選的是「只要這一幀真正存下的畫素」。改成「看上去的那一幀」,每張 PNG 就都是動畫在那一刻的整幅畫面了。

透明保留得住嗎?

保留得住。GIF 的透明只有一位,一個畫素要麼畫上了要麼看不見,中間沒有過渡,而 PNG 存的正好就是這個,所以幀出來時透明區域是完好的。你要是更想要實心背景,把「透明區域」改成填一個顏色,那個顏色會寫進 PNG,之後就取不出來了。

為什麼幀延時不是我以為的數字?

GIF 裡每幀延時是按百分之一秒存的,而從九十年代起,瀏覽器就把小於兩個百分之一秒的值一律抬到十分之一秒。這條規矩是為當年那些轉動的地球圖寫的,後來一直沒刪。所以檔案裡寫 0.01 秒的幀,在哪裡都是按 0.10 秒播。這個工具顯示的是真正播出來的延時,兩者對不上時,會把檔案裡存的值寫在旁邊。

拆出來的幀還能拼回去嗎?

能,用本站的 GIF 製作,或者任何接受一資料夾圖片的工具都行。ZIP 裡那個 frames.txt 就是為這個準備的:拆動圖會把時間資訊丟掉,因為 PNG 沒有地方記自己停留了多久,所以由這份清單把每幀的延時和位置一起帶出來。

幀可以存成哪些格式?

PNG,而且是有意只給 PNG。GIF 的一幀最多 256 色、一位透明,PNG 能原樣無損地存下來;換成 JPEG 就會把透明丟掉,憑空造出這一幀本來沒有的顏色,而且對平塗畫面來說通常還會更大。要是你確實需要 JPEG,事後用圖片尺寸調整轉一遍。

能讀的幀數有上限嗎?

沒有固定上限。真正的天花板是你機器的記憶體:GIF 在讀取過程中會膨脹到每幀每畫素約一個位元組,所以一個小檔案也可能是很大一塊記憶體。這個頁面寧可停下不讀,也不會讓分頁崩掉。真發生了它會說明,並把已經取到的幀交給你。

壞掉的 GIF 打得開嗎?

多數打得開。下載截斷、結束標記丟失、最後一幀在資料中間斷掉,這些都很常見,而一個見了就拒的讀取器,恰好對最需要拆開的那些檔案毫無用處。凡是完整的幀都會給出來,並附上哪裡不對。只有壓根不是 GIF 的檔案才會被直接擋掉。

它免費嗎,需要註冊嗎?

免費,沒有帳號,不用登入,也沒有試用期。幀上同樣沒有水印。本站帶廣告,經費就是從那裡來的,廣告拿不到任何關於你檔案的資訊。

斷網能用嗎?

能。頁面載入一次之後斷開網路,它照樣運作。這也是證明「什麼都沒上傳」最省事的辦法,真要把你的動圖送出去處理,拔線那一刻就停了。