普通圖片中的每個畫素都由三個數字描述:它包含多少紅、綠、藍。這足以說明畫素是什麼顏色,卻說明不了能否透過它看到後面的東西。alpha 通道就是每個畫素的第四個數字,專門做這件事:它儲存不透明度,範圍從完全透明到完全不透明。
人們說“透明背景的 PNG”,指的是帶有 alpha 通道、且背景畫素的 alpha 為零的圖片。本指南解釋這個數字如何起作用、軟體儲存它的兩種方式、邊緣為什麼會出問題,以及如何檢查檔案裡到底有什麼。
RGBA:每個畫素四個通道
MDN 對 alpha 通道的定義很簡單:顏色由通道(紅、綠、藍)組成,要描述一種“在一定程度上可以透過它看到背景”的顏色,就要加上第四個通道。四個通道都有的圖片稱為 RGBA。
這個值有幾種寫法,含義都一樣:
| 表示法 | 完全透明 | 半透明 | 完全不透明 |
|---|---|---|---|
| 8 位整數(大多數圖片檔案) | 0 | 128 | 255 |
| 16 位整數(16 位 PNG) | 0 | 32768 | 65535 |
| 小數(合成運算、CSS) | 0 | 0.5 | 1 |
| 百分比(CSS) | 0% | 50% | 100% |
十六進位制字尾(CSS #rrggbbaa) | 00 | 80 | ff |
PNG 規範說得很精確:alpha 值為零表示完全透明,該位深的最大值表示完全不透明,中間值則是“可以與背景影像合成”的半透明畫素。
這些中間值才是關鍵。好的去背不只是“主體不透明、背景透明”。邊緣上的畫素,尤其是頭髮、毛髮、織物、玻璃和運動模糊處的畫素,是部分透明的,正是它們讓主體放在新背景上看起來自然,而不像是用剪刀剪下來的。
透明畫素是怎樣繪製的
當應用把你的圖片疊放在其他內容上時,會把每個畫素和它後面的內容混合。W3C 的合成與混合規範給出了基本公式:
result = Cs x as + Cb x ab x (1 - as)
Cs, as = color and alpha of your image (the source)
Cb, ab = color and alpha of what is behind it (the backdrop)在背景不透明這種常見情況下,它就變成一個加權平均。一個 alpha 為 0.3 的畫素貢獻 30% 自己的顏色,讓 70% 的背景透過來。
直通 alpha 與預乘 alpha
儲存半透明畫素的顏色有兩種方式,把它們搞混是出現深色或亮色邊緣的典型原因。
直通 alpha(也叫非關聯或非預乘 alpha)按畫素完全不透明時的樣子儲存顏色,並單獨儲存不透明度。一個半透明的純紅畫素儲存為紅 255、綠 0、藍 0、alpha 128。
預乘 alpha(也叫關聯 alpha)儲存的是已經乘以 alpha 的顏色。同一個畫素儲存為紅 128、綠 0、藍 0、alpha 128。用 PNG 規範的話說,這樣的影像“已經與黑色背景合成過了”。
檔案用哪一種,取決於格式和軟體:
- PNG 始終使用直通 alpha。規範明確這樣規定,並指出這讓編輯器可以輕鬆修改影像的透明度。
- 圖形管線、遊戲引擎和影片合成工具內部通常使用預乘 alpha,因為混合運算更簡單,濾波效果也更好。
當一個程式寫入預乘值、另一個程式卻按直通值讀取時,問題就來了。邊緣的顏色會過暗,形成一圈細細的黑邊。反過來則會讓邊緣過亮。如果某個工具輸出的每張去背都有一致的深色邊緣,首先要懷疑的就是預乘不匹配。
去背為什麼會有光暈
光暈是主體周圍一圈本不屬於它的可見邊緣。常見原因有四種,各有各的解決辦法。
1. 舊背景滲進了邊緣畫素
相機永遠拍不出乾淨的邊界。一縷頭髮襯著綠色樹籬,產生的畫素一部分是頭髮、一部分是樹籬。如果去背保留這些畫素的原始顏色、只是讓它們變成半透明,綠色就會一直混在裡面。放到白色背景上,主體就帶著一圈淡淡的綠光。
解決辦法是顏色淨化:為每個邊緣畫素估算真實的前景色,然後寫入這個顏色。Photoshop 在“選擇並遮住”工作區中把它叫作“淨化顏色”,開源的 rembg 庫有一個 decontaminate 選項,作用相同。它只改變邊緣顏色,從不改變蒙版的形狀。
2. 蒙版太硬
如果蒙版只有完全不透明和完全透明的畫素,邊緣就會出現鋸齒,原照片中的抗鋸齒還會在主體周圍留下一畫素寬的背景色線條。頭髮這類柔和的主體需要帶有真實中間值的柔和蒙版。
3. 透明畫素中隱藏的顏色
在直通 alpha 檔案中,alpha 為零的畫素仍然有紅、綠、藍值。你看不見它們,但縮放或模糊圖片時會混合相鄰畫素,如果這些隱藏的顏色是白色或黑色,就會滲進可見的邊緣。好的影像庫會在縮放前先預乘、縮放後再轉換回來,以避免這個問題。
4. 圖片被合併到了某種顏色上
GIF 和調色盤 PNG 通常只支援“開或關”的透明,所以工具在儲存前會把邊緣對著一種雜邊色(通常是白色)做抗鋸齒。這樣的圖片放在白色上看起來沒問題,放在任何更深的顏色上都會顯出白邊。如果你的去背要放在深色背景上,請用完整的 alpha 匯出。
蒙版、遮罩和 alpha:術語解釋
這些詞含義有重疊,用法也比較隨意。它們通常的意思如下:
- alpha 通道: 儲存在圖片檔案內部的不透明度值,每個畫素一個。
- 蒙版: 一張灰度圖,控制另一張圖的哪些部分可見。在 Photoshop 的圖層蒙版中,白色顯示、黑色隱藏,灰色部分可見。蒙版可以在不動原始畫素的情況下編輯,所以專業人士用蒙版而不是橡皮擦來去除背景。
- 遮罩(matte): 電影和合成領域對同一概念的稱呼,即定義保留內容的灰度圖。“摳像”(matting)指的是為頭髮這類難處理的邊緣計算出柔和、準確的遮罩。
- 三分圖(trimap): 一張粗略的三區域圖(確定是前景、確定是背景、不確定),一些摳像演算法以它為起點。
- 二值蒙版或硬蒙版: 只有黑白、沒有灰色。適合方塊和 logo,不適合頭髮。
- 去背: 最終結果,即主體的顏色加上 alpha 通道。
蒙版和 alpha 通道承載的是相同的資訊。很多工具兩種都能匯出:一種是內建 alpha 的透明 PNG,另一種是單獨的黑白蒙版圖,你可以在編輯器或影片工具中自己應用。
哪些格式能儲存 alpha
| 格式 | alpha 支援 |
|---|---|
| PNG | 完整 alpha(8 位或 16 位),或單一透明調色盤顏色 |
| WebP | 完整 alpha,無損和有損模式都支援 |
| AVIF | 完整 alpha |
| GIF | 只有開或關:把一種調色盤顏色標記為透明 |
| JPEG | 不支援 |
這些格式的完整對比,請參閱 PNG、JPEG 與 WebP 對比。
如何檢查圖片是否有透明
檔案以 .png 結尾並不能證明它是透明的。很多 PNG 是完全不透明的,網上找到的一些“透明”圖片其實是把灰白棋盤格畫進畫素裡的 JPEG。下面是可靠的檢查方法。
用肉眼
把圖片分別放在深色和淺色背景上,例如放進幻燈片或設計工具。真正的去背在兩種情況下都會在主體周圍顯示出背景色。如果仍然看到棋盤格,它就是圖片的一部分,而不是透明。
用 ImageMagick
# Does the file have an alpha channel at all?
identify -format "%A\n" photo.png
# Is it fully opaque anyway? (true means no visible transparency)
identify -format "%[opaque]\n" photo.png%A 報告透明通道(打印出的具體字樣在 ImageMagick 6 和 7 之間有所不同),%[opaque] 會計算是否每個畫素都完全不透明。你希望看到的是有 alpha 通道,並且結果為 false。
用 Python 和 Pillow
from PIL import Image
im = Image.open("photo.png")
print(im.mode) # RGBA or LA means an alpha channel
print(im.has_transparency_data) # True if the file carries any transparency info
if "A" in im.getbands():
lo, hi = im.getchannel("A").getextrema()
print("alpha range:", lo, hi) # lo == 255 means nothing is transparent極值檢查能發現一種常見情況:RGBA 檔案中的每個畫素其實都是不透明的。
平臺忽略 alpha 時
有些地方會去掉或忽略透明。Etsy 表示不支援透明 PNG,透明區域可能顯示為黑色,而 Amazon 和 Walmart 等電商平臺本來就要求主圖使用純白背景。在這些情況下,請自己把去背合併到背景色上,這樣結果由你掌控。在你自己的網站、幻燈片和設計工具中,保留 alpha。
快速獲得乾淨的 alpha 通道
如果你需要的是邊緣柔和的去背而不是硬蒙版,removebackground.dev 會生成帶完整 alpha 通道的透明 PNG 或 WebP 檔案,它的 API 還可以單獨返回灰度蒙版。
常見問題
RGBA 是什麼意思?
紅、綠、藍和 alpha。前三個描述畫素的顏色,第四個描述它的不透明度,從 0(完全透明)到最大值(8 點陣圖像中為 255)表示完全不透明。
直通 alpha 和預乘 alpha 有什麼區別?
直通 alpha 把畫素的完整顏色和不透明度分開儲存。預乘 alpha 儲存的是已經乘以不透明度的顏色,就像已經和黑色背景合成過一樣。PNG 始終使用直通 alpha;很多渲染和影片工具內部使用預乘 alpha。
為什麼我的去背有一圈白色或彩色輪廓?
通常是舊背景仍然混在邊緣畫素裡,或者圖片在儲存前對著白色做了抗鋸齒。淨化邊緣顏色、使用柔和蒙版,並用完整 alpha 而不是雜邊色匯出,可以解決大多數情況。
蒙版和 alpha 通道是一回事嗎?
它們承載相同的資訊:每個畫素一個灰度值,表示它有多可見。alpha 通道儲存在圖片檔案內部;蒙版通常是一張單獨的灰度圖,或編輯器中的圖層蒙版。
怎麼知道一張 PNG 是否真的透明?
把它分別放在深色和淺色背景上,看背景是否透出來。也可以用 ImageMagick 的 identify 配合 %[opaque],或在 Pillow 中檢查 alpha 通道的最小值;最小值為 255 表示沒有任何透明部分。
用你自己的圖片試試
新帳戶可獲得 50 個免費額度。每張圖片 1 個額度,無需訂閱,額度永不過期。
去除背景資料來源
- MDN: Alpha (alpha channel) glossary entry
- W3C: Portable Network Graphics (PNG) Specification (Third Edition)
- W3C: Compositing and Blending Level 1, simple alpha compositing
- MDN: Image file type and format guide
- Adobe Help: Select and Mask in Photoshop
- Adobe: Remove background with AI in Photoshop (layer masks)
- rembg README: color decontamination and edge modes
- ImageMagick: Format and print image properties (escapes)
- Pillow: Image module reference
- Etsy Help: Requirements and best practices for images in your Etsy shop