給客戶做一個站點的首頁標識,他發來一張 240×240 的 PNG,說這是官方 logo,放大用沒問題。我把它轉成 SVG 交付,結果 hero 區把它撐到 1200 像素寬,邊緣一圈鋸齒全冒出來,客戶問我:轉成 SVG 不是能隨便放大嗎?
後來我把這個問題的答案收斂成一句話:能不能放大,取決於 SVG 檔案裡面裝的是什麼,而不是取決於副檔名。
點陣圖和向量圖的差別是記錄方式,不是清晰度
點陣圖(PNG、JPG、WebP、GIF、BMP 都是)記錄的是每個位置的顏色值。它的尺寸就是天花板:512×512 的圖放到 5120×5120,等於每個原始像素被攤成 10×10 的方塊,中間的顏色由插值算出來,邊緣於是發虛或者起台階。
向量圖記錄的是幾何描述——形狀、路徑、錨點、填色。它沒有「原生尺寸」這一說,算圖時按目前檢視大小現算,1200 像素寬和 12000 像素寬用的是同一份資料。
所以「PNG 轉 SVG」這句話底下藏著兩條完全不同的路。一條是封裝:把點陣圖原樣嵌進 SVG 檔案,外面套一層向量容器。另一條是描摹:真的去產生路徑。封裝的放大表現跟原 PNG 一樣,只有描摹才拿到向量的紅利。
| 做法 | SVG 裡存的內容 | 放大 5 倍後的邊緣 | 體積 | 能不能單獨改某個顏色 |
|---|---|---|---|---|
| 封裝(內嵌點陣圖) | 原圖的像素資料,編碼後寫進 image 元素 | 仍是插值結果,細節不會變多 | 比原 PNG 大約多三分之一 | 不能,整張圖是一個點陣圖 |
| 描摹(轉路徑) | 若干 path 與填色 | 邊緣乾淨,輪廓按幾何重算 | 取決於路徑與節點數量 | 能,每個色塊單獨可選 |
| 手工重繪 | 按需畫的 path | 乾淨 | 通常最小 | 完全可控 |
表格第三行那個「多三分之一」是能算的:內嵌的資料要經過 Base64 這類編碼,字元數約為原始位元組的 4/3,所以檔案比原圖大出三成上下。轉換本身不損失畫質,代價是體積。
描摹這條路的上限由三個參數決定
我試過不少描摹工具,旋鈕基本是這三類,理解它們才不會對結果抱錯誤期待。
- 閾值:把灰階切成「是黑」和「是白」兩類的分界線。閾值往上或往下挪一點,剪影的粗細就變了。二值描摹只可能產出純色形狀,一張有層次的照片在這裡必然丟資訊。
- 色階數:允許多少種顏色參與生成。給到 4 色、8 色、16 色,貼合度依次上升,但產生的路徑數量也依次上升,最後可能得到幾千個色塊碎片,反而比原圖更難編輯。
- 節點與平滑:控制輪廓跟隨原圖邊緣的緊不緊。跟隨得緊,鋸齒狀的邊緣雜訊也會被忠實地描出來;放得鬆,形狀圓滑但細節糊掉。
把這三個參數當成「畫質調節」來看,是大部分失望的來源。它們調節的是擬合策略,不能憑空補出原圖沒有的細節。適合描摹的圖有共同特點:色塊少、邊界清楚、沒有連續漸層——純色 logo、文字、印章、剪影、線稿、像素風圖形。不適合的也很明確:人像照片、風景照、帶陰影漸層的寫實插畫、毛髮和煙霧這類高頻紋理。
那什麼時候我還是會把 PNG 轉成 SVG
封裝模式並非沒用,我自己在這幾種情況下就明確要它:
- SVG 專案裡要嵌點陣圖素材,格式必須統一成 SVG;這時我需要的是容器,不是路徑。
- 要一個不損失原始畫質的容器版本,縮放交給檢視尺寸去管,點陣圖本身保持原樣,轉換過程不做二次編碼壓縮。
- 要把圖片資源以 SVG 形式交給網頁或向量編輯器,尺寸和版面由下游決定。
這幾種情況下我用 圖片轉 SVG,支援 PNG、JPG、WebP 這類常見格式,能批次處理。對我判斷「放大到底會不會糊」最關鍵的反倒是它的另一個功能:產生之後可以直接檢視 SVG 原始碼。原始碼裡看到的是 <image> 加一串編碼資料,還是 <path> 加座標,一眼就能定結論——不用等到上線後在 hero 圖上看到鋸齒。
如果需求其實是「要一張更大的點陣圖」,那方向完全不同,該做的是像素尺寸調整,我用 圖片尺寸調整,它同樣不會補出細節,但至少輸出的是明確的點陣圖,不用解釋為什麼容器變了而邊緣沒變。已經拿到 SVG 但要交回點陣圖格式時,我用 SVG 轉換格式 把方向反過來走。
那次交付最後怎麼收場
客戶的 logo 是三個字加一個圓環,總共 3 個填色。我沒有在描摹參數上耗時間,照著原圖手工畫了 path,不到 100 個節點,花了四十分鐘。放大到 hero 尺寸邊緣乾淨,顏色能單獨調,檔案比那張 PNG 還小。
如果它是那種帶漸層和陰影的寫實圖示,我不會有這個選擇——那時候正確的答覆是「請給原始檔(AI、SVG、或者至少一張高解析度 PNG)」,而不是指望任何轉換參數。
Q:轉成 SVG 之後放大還是糊,是不是轉換失敗了?
不一定是失敗。打開 SVG 原始碼看內容就能判定:裝的是內嵌點陣圖就是封裝模式,放大表現自然和原圖一致;只有真的產生了路徑才談得上向量放大。
Q:照片能向量化嗎?
能產生路徑,但通常不像你要的結果。照片的漸層會讓描摹產出海量碎片色塊,檔案巨大且無法編輯。真要放大照片,方向是提高解析度或重拍,不是換格式。
Q:閾值調高一點是不是更精細?
閾值改變的是保留哪一部分,不是精度。剪影類圖形上它是有效旋鈕;有灰層次的圖上,往任何方向調都會丟掉另一邊的層次。
Q:轉成 SVG 體積會不會更小?
封裝模式一般更大,因為編碼開銷約是三分之一。少色圖形被描摹成路徑時可能顯著變小,照片類則往往變大。
Q:印刷要用,轉成 SVG 就夠了嗎?
不夠,如果裡面是點陣圖,印刷解析度仍然按原始像素算。我給的判斷是:印刷檔案要求路徑或者 300dpi 以上的點陣圖,兩者都不滿足就得重做。
客戶的疑問到這就清楚了:SVG 不是「高畫質」的同義詞,它是一種容器和描述方式。我後來的流程裡多了一步硬性檢查——交付前打開原始碼確認裡面是 path 還是 image,並據此告訴對方這張圖能放大到什麼程度。副檔名會騙人,原始碼不會。