反轉影像顏色是在位元層級將每個紅色、綠色和藍色通道替換為其互補值,對每個通道套用公式 output = 255 減去 input,同時保持 alpha 通道不變。當套用於完全不透明的來源時,此規則會把黑色變成白色、白色變成黑色、紅色變成青色、綠色變成洋紅色,而藍色變成黃色,整個過程不涉及任何感知校正、gamma 調整或底片遮色去除。想要在 JPG、PNG、GIF 或 WebP 等點陣圖上產生此效果的 Figma 使用者,無法直接在 Figma 內套用,因為 Figma 的原生色彩控制項作用於填色、描邊和圖層效果,而非匯入點陣圖內部的像素資料。可靠的做法是將影像從 Figma 匯出,執行一次本機瀏覽器式的 RGB 反轉,然後把新產生的靜態 PNG 以替換圖層的方式放回同一個 Figma 檔案中。

為何 Figma 無法自行反轉點陣圖
Figma 將匯入的點陣圖視為不透明的像素容器。你可以移動、縮放、遮罩它們,使用圖層不透明度進行混合,並對整個圖層套用 Difference 或 Invert 等混合模式,但 PNG、JPEG、GIF 或 WebP 內部的底層位元值仍維持你匯入時的原始內容。原生的圖層混合模式只是把像素與圖框中位於下方的內容重新組合,並不會改寫儲存的位元。
真正的位元層級反轉只會作用於向量填色、描邊、文字,以及 Figma 自有圖層上一小部分效果。一旦你把手機拍來的 JPG、PNG 螢幕擷圖,或行銷匯出的 WebP 放到 Figma 畫布上,色彩就已被固定為點陣位元。設計師通常會求助於外掛,或者更常見的做法是先在 Figma 之外編輯檔案,再換回來。
Invert Image Colors 工具正是用於這個外部編輯步驟。它會讀取實際的位元容器,透過瀏覽器解碼第一幀,對 Canvas 暴露出的每個 RGBA 位置套用該公式,並以原始尺寸匯出靜態 PNG。沒有任何內容會被上傳、不會被伺服器重新壓縮,也不會在未經你同意的情況下被重新取樣或縮放。
先把影像從 Figma 匯出
在 Figma 內開始,匯出你想要反轉的影像。在圖層清單中選取該圖層,然後在右側面板中選擇 Export。為了讓工具的容器檢查通過,請挑選最接近你來源的格式:
- 如果你的來源具有透明度或銳利邊緣(例如 UI 螢幕擷圖、圖示或貼紙),選擇 PNG。
- 針對照片和帶有雜訊的產品照片,選擇 JPEG,並接受其有損壓縮的權衡。
- 當來源是動畫 GIF,而你想要反轉後的第一幀靜態預覽時,選擇 GIF。
- 當來源是具有透明度的現代網頁匯出格式時,選擇 WebP。
請以原始解析度進行匯出。反轉工具會拒絕任一解碼後邊緣超過 8,192 像素,或總像素面積超過 24,000,000 的檔案,因此一張 4K 或 8K 的照片可能會在進行任何反轉之前就被合理地拒絕。如果你的匯出檔案太大,請先用 Image Resizer 工作流程把圖層縮小,或裁切掉多餘的邊緣,再進行匯出。
使用瀏覽器工具在本機反轉你的影像
一旦檔案存到磁碟後,反轉本身只需要三個操作步驟,並且全程停留在你目前的瀏覽器分頁中。
- 開啟 Invert Image Colors 頁面,選擇 PNG、JPEG、GIF 或 WebP 檔案。等待位元容器偵測、瀏覽器解碼與尺寸驗證完成且不出錯。
- 工具會反轉解碼後的第一幀,並並排顯示兩個原始尺寸的 PNG 預覽:一邊是來源,另一邊是反轉後的結果。請加以比對,確認效果符合你想要的視覺。
- 確認尺寸與所回報的輸出位元大小,然後下載靜態 PNG。檔案會以真正的 PNG 容器與原始像素尺寸存到你的下載資料夾。
下載會透過 Canvas 的 toBlob 流程進行,因此輸出會是完整的 PNG,絕不會是截斷的檔案或被悄悄降級成 JPEG。若反轉因為防護機制(例如 null Blob、輸出超過 32 MiB、或同步例外)而失敗,忙碌狀態會清除,且不會留下任何陳舊的下載,因此你可以放心地重新執行該步驟。
把反轉後的 PNG 用回 Figma 中
把下載的 PNG 直接拖曳到開啟中的 Figma 檔案。Figma 會將其視為全新的點陣圖圖層,反轉後的色彩已烘焙於像素之中。將新圖層置於原始圖層之上,為其重新命名以便辨識,並在確認替換結果符合你的圖框配置後,隱藏或刪除來源圖層。
如果原始影像位於元件或鎖定的圖框中,請將新圖層放在同一個圖框上,然後在來源圖層上按右鍵並將其移到最下層,或是在用移動工具複製其變形屬性後將其刪除。偏好非破壞性往返流程的設計師,通常會保留一個靜音的來源圖層,並在其上方使用反轉後的圖層,這樣就能切換而不必重新執行匯出。
對於已使用共用元件的大型畫板或設計系統,整潔的做法是把反轉後的 PNG 存放在 Figma 素材庫或已連線的團隊素材庫中,讓每個取用的圖框都能拉到同一個反轉版本。
色彩對應規則,以表格表示
反轉規則與 Figma 用於向量填色與描邊的位元層級運算相同。由於這是位元運算而非感知運算,下表的對應是精確的:
| 來源色彩 | RGB 輸入 | 反轉後 RGB 輸出 | 可見結果 |
|---|---|---|---|
| 純黑 | (0, 0, 0) | (255, 255, 255) | 白色 |
| 純白 | (255, 255, 255) | (0, 0, 0) | 黑色 |
| 純紅 | (255, 0, 0) | (0, 255, 255) | 青色 |
| 純綠 | (0, 255, 0) | (255, 0, 255) | 洋紅 |
| 純藍 | (0, 0, 255) | (255, 255, 0) | 黃色 |
| 中間灰 | (128, 128, 128) | (127, 127, 127) | 接近中間灰,差一個位元 |
最後一列是有意為之:真正的中間灰位元是 128,而 255 減 128 得到的是 127,而非 128。位元規則並不會對齊到完美的鏡像,而是產生字面上的互補位元。因此,對同一組解碼後的位元執行兩次反轉,會得到相同的原始值,這也是確認該演算法屬於位元精確而非近似值的最簡單方式。
開始前必須知道的檔案、邊緣與像素限制
有四個獨立限制決定它會接受你的檔案,或在反轉之前就拒絕。所有限制都在精確的邊界上檢查,只要超出位元或像素一個單位就會被拒絕:
| 限制 | 數值 | 檢查位置 |
|---|---|---|
| 輸入檔案大小 | 上限 15 MiB | 回報的檔案大小與實際的 ArrayBuffer 長度 |
| 解碼後邊緣長度 | 每邊上限 8,192 像素 | 在 createImageBitmap 回報尺寸之後 |
| 解碼後總面積 | 上限 24,000,000 像素 | 解碼後點陣圖的寬度乘以高度 |
| 輸出 PNG 大小 | 上限 32 MiB | 在 Canvas 編碼結果之後 |
15 MiB 的輸入預算與 32 MiB 的輸出預算是刻意分開的,因為解碼後的 PNG 在每個像素都完全不透明時,體積可能會膨脹,尤其是帶有雜訊的照片。如果反轉後的 PNG 會超過 32 MiB,工具會在發佈 URL 之前讓匯出失敗,因此你絕不會看到寫到一半的檔案,或是被悄悄替換成有損 JPG 的 PNG。
容器檢查同樣嚴格到位元層級。工具不會信任檔名、檔案選擇器的篩選條件,或作業系統的 MIME 標籤。它會驗證 PNG 的簽章加上 IHDR 與結尾的 IEND、JPEG 的 SOI、後續標記與結尾的 EOI、GIF87a 或 GIF89a 標頭及其邏輯螢幕結構與結束符,或 WebP 的 RIFF 尺寸加上 WEBP 標記以及一個有界的 VP8、VP8L 或 VP8X 第一個區塊。被截斷的魔術位元、被改名的任意檔案,以及 SVG、AVIF、HEIC、BMP、TIFF 或 PDF 等不支援的格式,在 Canvas 開始工作之前就會失敗。
這個效果是什麼、不是什麼
反轉是一種位元通道的視覺效果,而非色彩管理的轉換,也不是底片負片修復。它不會將 gamma 線性化、不會模擬感知互補色、不會去除掃描中的橙色遮色、不會校正曝光,也不會進行色調分級。EXIF 方向標籤、GPS、ICC 色彩描述檔、註解以及其他來源中繼資料都不會被帶入 PNG 匯出,因為 Canvas 像素匯出不會保留它們。當動畫、嵌入的描述檔或中繼資料很重要時,請保留原始檔案。
動畫 GIF 與動畫 WebP 輸入會使用瀏覽器解碼後的第一幀,並成為單一的靜態 PNG。後續的影格、計時、循環、調色盤與銷毀行為都不會被保留,而當目標只是為 Figma 圖層提供單一的反轉圖片時,這正是正確的行為。如果你需要在動畫流程中使用反轉後的結果,請先用 GIF Splitter 把來源拆成影格,逐張反轉,再用 GIF 製作工具把它們重新組合。
本機瀏覽器處理有助於隱私,但成功解碼並不等同於惡意程式分析、內容審核、作者驗證,或是影像使用安全的證明。請將輸出視為你所產生的位元,而非關於來源的證據。
延伸閱讀:如何在 Canva 中從影像挑選顏色:4 個快速步驟。
延伸閱讀:如何在 Photoshop 或瀏覽器中製作純色。