# PNG to GIF

> 在瀏覽器裡把 PNG 減色成 GIF 的 256 色調色盤，色數與 dithering 都能調。原檔若是動畫 PNG，每個影格都留得住；實測 1,689,485 位元組變成 792,677。

- URL: https://bytescope.dev/zh-Hant/image-convert/png-to-gif/
- Locale: zh-Hant · Also: [en](https://bytescope.dev/en/image-convert/png-to-gif.md) · [ja](https://bytescope.dev/ja/image-convert/png-to-gif.md)
- Runs: 檔案不會離開你的瀏覽器 — 全部在本機處理。
- Requires: Any modern browser (Chrome, Edge, Firefox, Safari), desktop and mobile.
- Updated: 2026-09-08

## What it does

### PNG 轉成 GIF 會失去什麼

先掉的是顏色，而且掉得不含蓄。每個像素都得重新塞進最多 256 色的調色盤，上限由上面的滑桿決定；調色盤由 `@tools/core-image` 的量化器挑出來，除非你把 dithering 關掉，否則會用 Floyd–Steinberg 誤差擴散去鋪。一張本來用上好幾萬種顏色的照片改用 256 色重畫，天空和膚色會浮出色帶，誤差擴散再拿細碎的點把色帶蓋掉。關掉 dithering 點就沒了，換成邊界分明的色塊。本來顏色就少的平面插畫、像素圖和畫面截圖，幾乎看不出差別。

透明度留得住，但只留一個位元。減色之前會先把 alpha 色版以 128 為界二值化：比這更不透明的像素變成完全不透明，比這更淡的直接整個消失；夾在中間的半透明像素，在做這個判斷之前就已經先和設定裡的背景色合成掉了。所以柔順的去鋸齒邊緣和陰影會變成階梯狀的輪廓，而且工具一找到這種像素就會跳警告。只要畫面裡有透明，調色盤就得留一格給它，真正能畫圖的只剩 255 色。

反過來說，動畫不會消失。只要瀏覽器的 `ImageDecoder` 讀到不只一個影格，轉檔就走動畫路線：先掃過所有影格取樣顏色，做出一份共用的全域調色盤，再只寫出每個影格有變動的那一塊，原本的顯示間隔和循環設定都照抄。GIF 真正完全裝不下的是元資料。整個格式裡沒有 ICC 色彩描述檔、沒有 EXIF，也沒有超過 8 位元的深度，所以 16 位元的母檔和 Display P3 標記，在輪到調色盤之前就已經不見了。

### 實測時檔案大小怎麼變

2026-09-12，apps/web/scripts/measurePairs.ts 量的是從釘住 commit 的 libheif 範例做出來的 1280 × 854 PNG，跑過「最佳化 (oxipng)」之後是 1,689,485 位元組。這個工具預設把那個選項關著。用 256 色、Floyd–Steinberg、白底轉成 GIF 得到 792,677 位元組，大約少 53%。轉進一個無損格式卻砍掉一半，聽起來矛盾，但省下來的其實是顏色本身：GIF 只是把剩下的東西原樣存好。調色盤再往下壓檔案會更小，色帶也會同步變明顯；dithering 則是點狀雜訊，LZW 壓不動它，反而會把檔案推大。動畫是每個影格都要錢，這個比例完全套不上去。

### 什麼時候不該把 PNG 轉成 GIF

照片除非對方真的只收 GIF，否則別走這條路。256 色在任何調色盤設定下都是看得出來的降級，WebP 和 AVIF 用少得多的位元組就裝得下全部顏色。邊緣要保持柔順的 logo 也不適合：一個位元的判斷會留下鋸齒，如果素材當初是襯在別的顏色上做的，邊緣還會留一圈色暈。16 位元母檔、要送進 app 圖示流程的素材、之後還要再編輯的檔案，情況都一樣。真正適合的是像素圖和平面插畫、想用一個每個聊天視窗都會自動播放的格式丟一段短動畫、給吃不下新格式的郵件範本，以及那些相容清單停在九〇年代的機器和軟體。

轉換完全在你的瀏覽器內進行 — 不上傳、不排隊、無浮水印。想放幾個檔案都行，可逐一下載，也能打包成 zip。

## Limits

先掉的是顏色，而且掉得不含蓄。每個像素都得重新塞進最多 256 色的調色盤，上限由上面的滑桿決定；調色盤由 `@tools/core-image` 的量化器挑出來，除非你把 dithering 關掉，否則會用 Floyd–Steinberg 誤差擴散去鋪。一張本來用上好幾萬種顏色的照片改用 256 色重畫，天空和膚色會浮出色帶，誤差擴散再拿細碎的點把色帶蓋掉。關掉 dithering 點就沒了，換成邊界分明的色塊。本來顏色就少的平面插畫、像素圖和畫面截圖，幾乎看不出差別。

透明度留得住，但只留一個位元。減色之前會先把 alpha 色版以 128 為界二值化：比這更不透明的像素變成完全不透明，比這更淡的直接整個消失；夾在中間的半透明像素，在做這個判斷之前就已經先和設定裡的背景色合成掉了。所以柔順的去鋸齒邊緣和陰影會變成階梯狀的輪廓，而且工具一找到這種像素就會跳警告。只要畫面裡有透明，調色盤就得留一格給它，真正能畫圖的只剩 255 色。

反過來說，動畫不會消失。只要瀏覽器的 `ImageDecoder` 讀到不只一個影格，轉檔就走動畫路線：先掃過所有影格取樣顏色，做出一份共用的全域調色盤，再只寫出每個影格有變動的那一塊，原本的顯示間隔和循環設定都照抄。GIF 真正完全裝不下的是元資料。整個格式裡沒有 ICC 色彩描述檔、沒有 EXIF，也沒有超過 8 位元的深度，所以 16 位元的母檔和 Display P3 標記，在輪到調色盤之前就已經不見了。

## FAQ

### 動畫 PNG 轉成 GIF 還會動嗎？

會。影格不只一個的時候，工具會做出一張動畫 GIF，顯示間隔和循環設定都照原本的走；整段動畫共用一份調色盤，每個影格只寫出有變動的部分。轉完後的注記會告訴你留下了幾個影格。

### PNG 的透明邊緣為什麼在 GIF 裡變成鋸齒？

GIF 的透明度只有一個位元，每個像素只能是完全看得見或完全消失。alpha 色版會以中間值二值化，半透明的像素還會先和背景色合成，所以本來柔順的輪廓就變成一階一階的。

### 照片用 256 色夠嗎？

幾乎都不夠。一般照片用到的顏色遠超過調色盤裝得下的量，漸層會出現色帶，dithering 再拿看得見的點狀紋理去蓋住色帶。這是實實在在的降級，不是壓縮選項，所以只在對方只收 GIF 的時候才選它。

### 我的圖片會被上傳到任何地方嗎？

不會。轉換在你的瀏覽器內使用 canvas API 和 Web Worker 完成 — 檔案不會離開你的裝置。沒有上傳步驟、不用排隊，檔案大小也只受限於你電腦的記憶體。

### 轉換後的圖片會保留 EXIF 中繼資料嗎？

不會 — 而這正是特色之一。透過 canvas 重新編碼會移除所有中繼資料：GPS 位置、相機型號、時間戳記和色彩描述檔。輸出只包含像素，而這通常正是你公開分享圖片前想要的結果。

### 可以一次轉換很多張圖片嗎？

可以。拖放或貼上任意數量的檔案；每個檔案都會在背景轉換，各自有進度顯示和下載按鈕，也可以把全部內容打包成 .zip 一次下載。

### 轉檔會讓畫質變差嗎？

看你選的目標格式。不管來源和目標是哪兩種格式，轉換器一律先解碼成原始像素再重新編碼，中繼資料也是這樣被移除的。目標是無損格式（PNG，以及在 256 色限制內的 GIF）時，像素和解碼出來的完全一樣；目標是 JPEG、WebP 或 AVIF 時，則由品質滑桿控制取捨，而且來源本來就是有損檔的話，會再多疊一層損失。
