先說結論
開啟圖片壓縮,把照片丟進去,把人家給你的那個數字打進去,按按鈕。它會把圖編碼好幾遍,留下能塞進目標、又最好的那一份,並告訴你這一下花了多少。老實說,大多數照片配大多數目標,你根本看不出差別。
這一頁剩下的部分,是給看得出差別的情況準備的:結果發糊了、PNG 幾乎壓不動,或者你想在把圖發給別人之前,先弄清這個工具到底對它做了什麼。
一個檔案大小限制,實際上是在要什麼
JPEG 和 WebP 存的不是你的照片,是對這張照片的一段描述,而品質設定決定這段描述允許有多細。調低它,檔案就小,因為描述變糙了:細膩的紋理被平均掉,漸變出現色帶,邊緣泛起一圈淡淡的塊狀光暈。
所以,大小限制其實是給細節定的一筆預算。真正該問的不是「我能不能壓到 500 KB」,任何數字你都壓得到,而是「為了壓到這裡,我得放棄畫面裡的多少東西,而這些東西對我這次的用途要緊不要緊」。
兩條經驗。真實場景的照片,人臉、樹葉、布料,很能藏住壓縮痕跡,因為眼睛在裡面找不到一塊絕對平的地方去挑毛病。而截圖、圖表、logo,以及任何有大片純色和硬邊文字的東西,一壓就露,這類本來就該用 PNG 或者 WebP,而不是 JPEG。
為什麼沒有公式,以及那該怎麼辦
沒有哪個算式能算出「品質調到幾才剛好出一個 500 KB 的檔案」。這兩者之間的關係完全取決於畫面內容:同樣的設定下,一張大白牆的照片可能只有一張森林照片的十分之一大。凡是丟給你一句「品質:60」然後聽天由命的工具,都是在替你猜。
唯一靠得住的辦法是試。編一遍,看看多大,調一調,再編一遍。手動做這事很煩,所以壓縮工具才改成問你要一個品質數字,等於把這份煩瑣推給了你。自動做下來大約是八次編碼,而一張手機照片編八次,本世紀出的任何機器都是零點幾秒的事,所以本站這個工具改成問你要大小,搜尋它自己來。
它報出來的每一個大小,都是真編出來的檔案,不是估算。碰上有硬性上限的表單,這一點很要緊:一個樂觀了 2% 的估算,等於一次被打回來的上傳。
先花品質,再動畫素
把一個圖片檔案變小,只有兩條路。一是把同一張畫面描述得粗糙些,這是品質;二是描述更少的畫素,這是縮尺寸。兩者不等價,而且先後有講究。
品質先花,因為頭上大約 30% 的品質降幅,在照片上是真看不出來的,你扔掉的是格式本來存得比任何眼睛都仔細的那部分細節。畫素後動,因為品質一旦降到痕跡開始露出來,那麼一張尺寸小一點、畫質還體面的圖,就比一張全尺寸卻被壓爛的圖好看。畫素少一點但個個乾淨,勝過多一堆全糊了。
整套策略就這麼點東西,哪怕你用的是別的工具也值得記住:把品質往下調,調到開始不對勁了,就別再往下調,改成把圖做小。
什麼時候該主動縮尺寸
有時候那些畫素本來就是多餘的。一張 4000 畫素寬的照片,放在網頁上一欄 600 畫素寬的位置裡,扛著的是六倍於誰能看見的細節。你要是清楚這張圖最終待在哪裡,先按那個尺寸縮一下,大小問題往往就沒了,一點品質都不用花。做這件事的是圖片縮放,怎麼挑尺寸,它自己那篇指南裡講了。
挑格式
值得知道的格式有三種,瀏覽器三種都能寫。
- JPEG 是給照片用的。有損,但有史以來的東西都認得它,拍真實場景的照片用它至今仍是好選擇。它存不了透明。
- WebP 做同樣的事,做得更好:同等的、你分辨不出來的畫質下,比 JPEG 小 25% 到 35% 左右,而且保得住透明。現在的瀏覽器都讀它。少數老一點的桌面軟體,還有一些公司的上傳表單,仍然不認,這是不用它的唯一實在理由。
- PNG 是無損的,也就是又精確又大。截圖、logo、線稿,以及任何有硬邊或者大片純色的東西,用它是對的;照片用它是錯的。
要檔案的那一方沒提別的要求,那就用 WebP,同樣壓到目標,它留下的可見損傷比 JPEG 少。檔案要送進一個老系統,或者送進一個你沒法測試的系統,那 JPEG 是穩妥答案。
為什麼你的 PNG 壓不下去多少
這是最常見的意外,而且不是你手上那個工具的 bug。PNG 是無損格式,存的是一模一樣的畫素,也沒有品質這個旋鈕可擰,擰了它就成另一種格式了。PNG 壓縮器能做的,只是把同樣那些畫素打包得更聰明些,通常也就省下百分之幾。
所以,檔案必須小很多、而且必須還是 PNG,那剩下的槓桿只有尺寸:畫素少一點,或者顏色少一點。要是它不非得是 PNG 不可,那就得看裡面裝的是什麼:
- 存成了 PNG 的照片。非常常見,多半是無意的,也是這一頁裡最容易撿的便宜:轉成 JPEG 或者 WebP,往往能小上五到十倍,肉眼還看不出變化。
- 截圖或者示意圖。轉 WebP。你要它無損它就能無損,而同樣的畫素,它一般比 PNG 小。轉 JPEG 會把文字邊緣搞毛。
- 帶透明的 logo。WebP 保得住透明;JPEG 會拿一塊純色把它填掉,而那幾乎從來不是你想要的。
怎麼判斷壓完的還能不能用
看縮圖什麼都證明不了,縮圖大小下什麼都很好。有兩個更可靠的辦法:
按全尺寸看,盯著畫面裡最平的那塊地方。天空、皮膚、刷過漆的牆。壓縮損傷最先出現在平滑的漸變裡,表現為淡淡的方塊或者色帶,而那時細節豐富的區域還完全沒事。
工具要是給了測量值,就讀一讀。這裡的壓縮工具會把自己壓出來的結果解碼回去,跟原圖比對,報出 SSIM。這個數字比的是區域性的明暗、對比和結構,而不是數一數多少畫素變了,更接近人眼在意的東西。大約在 0.98 以上,兩張圖並排看已經很難分辨;低到 0.95 以下,發之前先自己看一眼。它同時也報 PSNR,就是傳統的那個分貝值,給習慣看它的人。
兩個數都在你自己的機器上算出來、擺給你看,而這正是它們的意義:把「品質損失很小」從一句宣稱,變成一個你能核對的數字。
發檔案之前,有三件事值得知道
壓縮會順帶清掉後設資料。重新編碼就是把畫面解碼成畫素、再把畫素編回去,而一張畫布上只有畫素,不帶任何標籤,所以 GPS 位置、相機型號、時間戳這些,乾脆就沒寫進新檔案。通常這算白撿的好處。你要是只想清掉標籤、畫面別動,那是另一件事:EXIF 檢視與清除只重寫容器,不重新壓縮任何東西,裡面到底有些什麼,它那篇指南講得很清楚。
同一個檔案絕不要壓第二遍。每一次有損編碼都會永久扔掉一些細節,而對一張已經壓過的圖再編一次,扔掉的更多,因為它會老老實實把第一遍留下的壓縮痕跡也保住,代價是真正的細節。永遠回到原圖,只壓一次。
留住原圖。有損編碼沒有回頭路。不管你最後發出去的是哪一版,一開始那個檔案,找個地方留著。
這些事一樣都不用上傳
瀏覽器內建 JPEG、PNG 和 WebP 編碼器已經很多年了,那就是把畫布裡的圖存下來時用的同一段程式碼。壓縮圖片屬於那類在技術上根本沒理由牽扯伺服器的工作,所以這裡的工具也就沒有伺服器:解碼、編碼、測量都在你自己的機器上,而頁面的 Content-Security-Policy 裡,沒有一個屬於本站的地址可以把圖送過去。
想確認這一點,不管在這裡還是在別處,最省事的辦法都是:把頁面開啟,斷開網路,照壓一張試試。還能用,就說明什麼都沒上傳。把檔案傳給線上轉換器安全嗎?裡還有另外三個同類檢查。