每個現代 Paint 風格的色彩反轉功能,都是將每個紅、綠、藍色通道以 255 減去原始位元組的方式取代,保留 alpha 通道不動。Paint 的指令正是圍繞著這個運算而設計,所有認真的瀏覽器複製版本也是如此,包括 Invert Image Colors——這兩個工具都遵循「輸出紅色等於 255 減去輸入紅色、輸出綠色等於 255 減去輸入綠色、輸出藍色等於 255 減去輸入藍色」的規則,套用於每個解碼後存留下來的像素。這個簡單的相減運算會產生照片負片的效果:黑色變成白色、白色變成黑色、紅色變成青色、綠色變成洋紅色、藍色變成黃色。由於規則是確定性的,連續套用兩次必定會還原回原本的位元組。Paint 與一個仔細打造的瀏覽器工具之間,仍存在幾項細微差異——選取行為、輸出格式、動畫處理、中繼資料,以及你的影像是否曾離開過本機——在選擇工作流程之前,這些都值得先了解清楚。

how to invert image colors in paint
How to Invert Image Colors in Paint (and Beyond)

像素層級的「反轉色彩」是什麼意思

「反轉」這個詞聽起來很戲劇化,但這個運算其實只是每個通道一行算術。對於解碼後影像中的每個像素,工具會計算新的紅色值為 255 減去舊的紅色值、新的綠色值為 255 減去舊的綠色值、新的藍色值為 255 減去舊的藍色值。控制透明度的 alpha 值則原封不動地複製過去。由於每個通道都是獨立的,這條規則可以從單一像素的色塊一路擴展到數百萬像素的照片,完全不需要參考相鄰像素。

透過一個具體的例子就能讓規則變得明確。假設有一個像素,其來源 RGB 三元組為 (128, 64, 200),完全不透明。輸出紅色為 255 − 128 = 127。輸出綠色為 255 − 64 = 191。輸出藍色為 255 − 200 = 55。結果為 (127, 191, 55),這是一種柔和的橄欖色調,正好是輸入的 RGB 互補色。對 (127, 191, 55) 再執行一次相同公式,就會還原為 (128, 64, 200),這也是為何「雙重反轉」會成為任何反轉實作的標準健全性檢查。

當 alpha 通道不是 255 時,RGB 部分仍適用這條規則,但實際看到的顏色會取決於像素下方的內容。在白色頁面上的一個 50% 透明紅色,反轉後看起來不會像 50% 透明的青色;它看起來會像 50% 透明的青色與同樣的白色背景混在一起。這種混色是正常現象,也正是 Paint 實際產生的結果。

在 Microsoft Paint 中執行(經典方法)

Paint 內建一鍵反轉功能,運作原理也是上述的逐通道規則。整個工作流程很短,但關於選取行為與檔案格式的幾項細節,對於真正取得你想要的結果很重要。

  1. 在 Microsoft Paint 中開啟你的影像。使用檔案 > 開啟,或將檔案拖曳到 Paint 視窗中。
  2. 決定要反轉整個畫布還是僅反轉部分區域。在沒有選取任何項目的情況下,反轉色彩指令會影響畫布上的每個像素。如果你只想處理某個區域,請選擇選取工具、畫一個矩形,或在套用指令前按 Ctrl+A 選取全部。
  3. 套用反轉。點選影像 > 反轉色彩,或使用鍵盤快速鍵 Ctrl+Shift+I。選取虛線框會維持在原位;只有其下方的像素會改變。
  4. 儲存檔案。使用檔案 > 儲存來覆寫原始檔案,或使用檔案 > 另存新檔來選擇新格式。JPEG 輸出為有損壓縮,因此無論是否進行反轉,將 JPEG 重新存回 Paint 都會進一步降低品質。

有兩項 Paint 的行為很容易被忽略。第一,不規則與矩形選取只會反轉所包圍的像素,因此若需要不規則輪廓,必須使用不規則選取工具並畫出封閉路徑。第二,Paint 不會保留 EXIF 中繼資料、ICC 色彩描述檔或動畫:匯入 Paint 的多格 GIF 會被攤平為第一格,而 JPEG 一旦經過 Paint 重新編碼,就會失去大部分的拍攝中繼資料。如果上述任何細節對你很重要,就有理由考慮 Paint 以外的方案。

瀏覽器工具在這項工作上勝過 Paint 的時機

Paint 雖然方便,但同樣的逐像素規則可以在瀏覽器分頁中執行,無需安裝、無需上傳,並產生無損的 PNG 輸出。Resizing an Image in Paint? Try Your Browser Instead 這篇文章說明了將常見的 Paint 工作搬遷到本機瀏覽器工具的整體模式,而反轉色彩的情境也適用同樣的論點:瀏覽器工具可以讀取位元組、加以解碼、執行公式,然後交還一個 PNG,全程不需要將你的檔案送到伺服器。

隱私是改用瀏覽器工具的首要理由。How to Invert Colours on an Image Without Uploading It 用白話說明了其中的差異:本機工具會將讀取、解碼、轉換與編碼全部保留在當前分頁內,而一般常見的「免費反轉工具」則會將原始檔案上傳到遠端服務。對於個人照片、掃描文件,或任何含有嵌入中繼資料的檔案,本機處理路徑在建構上就更安全。

檔案處理是第二個理由。Paint 在處理極大的影像時會遇到困難,並會將任何動畫輸入攤平為第一格。一個具有明確位元組預算與每邊像素上限的瀏覽器工具,可以在你嘗試處理太大檔案時顯示清楚的「檔案過大」訊息,而不是讓畫布卡住;同時也能在反轉過程中保留 alpha,使透明 PNG 能正確地完整往返。無損的 PNG 輸出也避免了 Paint 在重新儲存照片時造成的第二代 JPEG 品質劣化。

在瀏覽器中逐步反轉影像

Invert Image Colors 工具使用與 Paint 相同的「255 減通道值」規則,但所有運算都在本機進行,並回傳一張靜態 PNG。整個互動流程由三個操作步驟構成。

  1. 選擇一個 PNG、JPEG、GIF 或 WebP 檔案,並等待位元組容器偵測、瀏覽器解碼與尺寸驗證。工具會檢查實際的檔案位元組——而不是檔名或所提供的 MIME 類型——並要求在開始任何像素處理之前完成真正的瀏覽器解碼。
  2. 反轉已解碼的初始影格,然後比較來源與完整的原尺寸 PNG 預覽。每個透過 Canvas 暴露的像素都會經過 255 − R、255 − G、255 − B 的轉換,alpha 則原封不動地複製;因此透明像素會保留其透明度,完全不透明的像素則保留其形狀。
  3. 確認尺寸與輸出位元組大小,然後下載靜態 PNG。匯出的永遠是完整的 PNG;不會產生截斷或有損的替代方案;任何超出獨立 PNG 位元組預算的輸出,會在下載連結顯示之前被拒絕。

在執行中途選擇不同的檔案會遞增工作世代,關閉前一個 ImageBitmap,並撤銷舊的預覽 URL,因此過期的下載內容絕不會洩漏到新的選取結果。整個迴圈已針對 React Strict Mode 的雙重 effect 週期以及 null 的 toBlob 回呼進行防護,這也是「確認尺寸並下載」步驟在第一次嘗試就能可靠執行的實務原因。

色彩對應參考表

下表列出常見的輸入色彩,及其經過一次反轉後精確的 RGB 互補色。這些都是公式的確定性輸出,而非取樣值,因此適用於任何遵循「255 減通道值」規則的工具。

Input colorRGB inRGB out
Black(0, 0, 0)(255, 255, 255)
White(255, 255, 255)(0, 0, 0)
Red(255, 0, 0)(0, 255, 255)
Green(0, 255, 0)(255, 0, 255)
Blue(0, 0, 255)(255, 255, 0)
Cyan(0, 255, 255)(255, 0, 0)
Magenta(255, 0, 255)(0, 255, 0)
Yellow(255, 255, 0)(0, 0, 255)
50% gray(128, 128, 128)(127, 127, 127)

請特別注意 50% 灰階那一列。由於 255 減 128 是 127 而非 128,灰階漸層的正中央在反轉後會偏移一個位元組。這種不對稱性對視覺工作無害,是公式本身的已知特性,並非錯誤。

檔案限制、驗證與被捨棄的內容

Invert Image Colors 在逐像素轉換的前、中、後各階段都會套用一連串明確的檢查。這些檢查沒有一個是隱藏的,也沒有一個會靜默地調整大小、裁切或縮放你的影像。具體的硬性限制條列如下。

BoundaryValue
Reported file size (input)≤ 15 MiB
Actual ArrayBuffer length (input)≤ 15 MiB
Output PNG byte budget≤ 32 MiB (separate from input)
Decoded edge length≤ 8,192 pixels per side
Decoded pixel area≤ 24,000,000 pixels total

輸入與輸出預算刻意分開,因為一張雜訊較多的照片或複雜插畫的 PNG 重新匯出,通常會比原本的 JPEG、GIF 或 WebP 還大。一個檔案若解碼後符合邊長與面積限制,但展開後超過 32 MiB 的 PNG 上限,會在發布下載連結之前被拒絕,並顯示明確的錯誤,而非產生截斷的影像。MDN 參考文件中關於 HTMLCanvasElement.toBlob 的說明,描述了該工具在這項檢查中所依賴的同步匯出行為。

格式偵測採用結構性方式而非依賴檔名。工具會讀取實際的 ArrayBuffer,檢查 PNG 簽章加上 IHDR 加上結尾的 IEND、JPEG 的 SOI 加上後續的標記加上 EOI、GIF87a 或 GIF89a 標頭加上邏輯螢幕結構加上結束符,或精確的 RIFF 位元組計數加上 WEBP 標記加上有界範圍的 VP8、VP8L 或 VP8X 第一個區塊。WebP RIFF container 的 Google 說明文件定義了該位元組配置。從 SVG、AVIF、HEIC、BMP、TIFF 或 PDF 重新命名的檔案,即使副檔名宣稱符合,也會在結構性檢查時失敗,並在任何 Canvas 處理開始之前就被擋下。

部分來源屬性是刻意不被保留的。EXIF、GPS、ICC 色彩描述檔、註解以及其他來源中繼資料,都不會被帶入 PNG 輸出。動畫 GIF 與動畫 WebP 輸入僅使用瀏覽器解碼的初始影格,因此無論來源有多少影格或循環次數,結果都是單一張靜態 PNG。半透明像素會保留其 alpha,但瀏覽器解碼器或 Canvas 可能在迴圈看到之前先行正規化視覺上隱藏的 RGB,因此輸出中完全透明的區域,未必是輸入中完全透明區域的字面互補色。如果上述任何細節對你的檔案很重要,請將原始檔案與反轉後的 PNG 一起保留。