使用外指指令 potrace 轉換 bmp 格式為 svg 格式
前置作業
使用前,需要先安裝 potrace:
https://potrace.sourceforge.net/#downloading
Max腳本檔案下載:
https://github.com/max32002/MaxFontScripts/blob/master/bmp_to_svg.py
使用方法
bmp_to_svg.py --input from_folder --output to_folder
參數說明:
--input: 存放 .bmp 的目錄, 支援格式: bmp, pbm, pgm, ppm--output: 要輸出的修改後 svg 目錄--single_thread: 使用單一個 thread, 一次處理一個檔案. 預設值不使用 single thread, 是 multi thread.--cwd: 切換執行 shell command 的工作目錄(work directory).
如果你的資料是 .bmp, .pbm, .pgm, ppm 的話, 速度會比較快, 可以直接呼叫 potrace, 但程式也支援: ‘.jpg’, ‘.jpeg’, ‘.png’, ‘.gif’, ‘.tif’, ‘.tiff’ 格式, 會幫你自動轉檔為.pbm.
針對 ZenMaruGothic-Regular(圓體)這種風格,其核心特徵在於圓潤的筆畫末端與平滑的轉角。若要將 BMP 轉為 SVG 並保留這種「柔和、乾淨」的視覺感,potrace 的參數設定至關重要。
以下是針對該字體風格建議的 potrace 參數優化方案:
1. 核心參數建議值
| 參數 | 建議值 | 說明 |
|---|---|---|
-a (alphamax) | 1.0 ~ 1.3 | 轉角平滑度。數值越大轉角越圓。對於圓體字,建議設在 1.1 以上(預設為 1.0),能有效防止圓角變尖。 |
-t (turdsize) | 2 ~ 5 | 雜點過濾。過濾掉小於此像素面積的孤島。對於字體,設為 2 可保留標點符號,同時去除掃描噪點。 |
-O (opttolerance) | 0.2 | 曲線最佳化。控制曲線切換的精確度。設為 0.2 能讓線條更簡潔,減少 SVG 節點數,使圓體看起來更流暢。 |
-u (unit) | 1 | 座標精度。確保路徑轉換時的細節不會因為取整數而產生鋸齒。 |
2. 針對 ZenMaruGothic 的策略分析
轉角平滑化 (-a 參數)
ZenMaruGothic 的特色是「圓」,因此我們不希望看到任何尖銳的折角。
- **若設定
-a 0**:會變成完全的直線折角(像像素字)。 - **若設定
-a 1.3**:會盡可能將所有轉角轉換為貝茲曲線。 - 建議:使用
-a 1.2。這能在維持圓潤感的同時,不至於讓筆畫過度變形。
細線與雜訊處理 (-t 參數)
在字體轉換中,potrace 的 -t (turdsize) 主要是用來清除 BMP 上的碎屑。
- 建議:如果你的 BMP 來源很乾淨,
-t 2即可。如果 BMP 是由掃描取得,建議調高到-t 5以確保字體邊緣不凹凸不平。
在平滑這裡遇到的最大的問題在, 預期應該是長條圖 , 由於交叉線的判斷, 造成線條在中間處變寬, 如下圖紅線部份所示. 再加上線條開始處的圓角變的更圓時, 就會讓預期的直線變成漏斗(或梯形).

vtracer 也是很多問題, 遇到曲線, 很容易崩掉。
3. 推薦的命令行範例
建議在轉換時組合使用以下參數:
potrace input.bmp -s -o output.svg -a 1.2 -t 2 -O 0.2
參數解析:
-s: 輸出格式為 SVG。-a 1.2: 強化轉角的平滑化,符合圓體特徵。-t 2: 移除極小雜訊但保留細節。-O 0.2: 自動優化控制點,讓圓弧線條更洗鍊。
4. 進階小撇步:前置處理
由於 potrace 只處理黑白二值圖,在執行上述指令前,請確保您的 BMP 具備以下條件:
- 高解析度:BMP 的解析度越高,
potrace計算出的曲線就越精準。 - 抗鋸齒處理:在將字體渲染成 BMP 時,建議開啟抗鋸齒(Anti-aliasing),但
potrace讀取前需要先進行閾值化 (Thresholding),讓邊緣黑白分明。
需要進一步調整嗎?
如果您發現轉換後的圓角還是太硬,您可以嘗試將-a提高到1.3。如果您發現字體的細節(如微小的勾筆)消失了,請將-z調小或增加原始 BMP 的解析度。
這兩款字體的特徵截然不同:Noto Sans 追求的是極致的幾何對稱與清晰度;而畫法字型(書法或手寫感字體)則包含大量的細節、毛邊與粗細變化。
針對這兩者,potrace 的參數邏輯需要完全相反:
1. Noto Sans (黑體/無襯線)
核心目標:俐壯的直線、精準的直角、極簡的節點。
對於 Noto Sans,我們不希望圓角化,而是要維持其工業感的銳利度。
-a 1.0(降低平滑度): 預設值 1.334 有時會讓 Noto Sans 的直角顯得稍微變圓。設為 1.0 可以確保直線交接處更加乾淨。-O 0.2(最佳化): 增加路徑最佳化程度,這能大幅減少 SVG 內的節點數量,讓檔案更輕量且邊緣更直。-t 2(雜訊過濾): 保持標準設定即可,因為 Noto Sans 的筆畫通常很厚實。
建議指令:
potrace input.bmp -s -o output.svg -a 1.0 -O 0.2 -t 2
2. 畫法字型 (書法/手寫/毛筆)
核心目標:保留墨韻細節、不破壞筆觸、容許複雜路徑。
書法字體最怕被過度平滑化,導致「墨味」消失,變成軟軟的塑膠感。
-a 0.6~0.8(極低平滑度): 這會保留筆畫邊緣的抖動感(飛白或毛刺),這是書法字型的靈魂。如果設太高,毛筆的蒼勁感會變成圓滑的曲線。-z 3~5(中等雜點過濾): 書法字轉 BMP 時容易產生微小的噴墨碎屑。如果這些碎屑不是你想要的,調高-z;如果你想保留「枯筆」感,則維持-z 2。-O 0(關閉最佳化): 建議關閉或設為 0。這能強迫potrace緊貼原始像素邊緣,不進行簡化,從而保留最完整的筆觸細節。
建議指令:
potrace input.bmp -s -o output.svg -a 0.8 -O 0 -t 3
3. 參數對比表
| 參數項目 | Noto Sans (幾何/簡約) | 畫法字型 (有機/細節) | 邏輯說明 |
-a (alphamax) | 1.0 | 0.7 ~ 0.8 | 數值低 = 保留更多轉角細節與抖動 |
-t (turdsize) | 2 | 3 ~ 5 | 視筆觸粗細調整,避免細碎筆墨變雜訊 |
-O (opt) | 0.2 (高) | 0 (關閉) | 書法字若開啟優化會導致筆鋒變形 |
-t (threshold) | 預設 | 0.4 ~ 0.6 | 書法字可微調門檻值來決定墨跡的厚薄 |
專家建議:如何選擇?
- 如果您發現 Noto Sans 的轉角「縮進去」了:請降低
-a到0.5或甚至更低,這會讓它更接近原始像素。 - 如果您發現畫法字型的「勾」變得很鈍:這是因為最佳化 (
-O) 太強了。請務必確保-O設為0。 - 解析度是關鍵:無論參數怎麼調,如果 BMP 原始解析度太低,書法字的細節永遠救不回來。建議 BMP 至少要有 1000×1000 px 以上。
增加了 --stroke_cap (縮寫 -c) 參數,並根據你之前的需求,將 「圓形 (roundcap)」、「方形 (squarecap)」 與 「毛筆 (calligraphy)」 三種模式對應到建議的 potrace 參數。
如何使用範例:
- 轉換 ZenMaruGothic (圓體):Bash
python script.py -i ./input_bmp -o ./output_svg -c roundcap(自動帶入-a 1.2 -t 2 -O 0.2) - 轉換 Noto Sans (方體):Bash
python script.py -i ./input_bmp -o ./output_svg -c squarecap(自動帶入-a 1.0 -t 2 -O 0.2) - 轉換 書法/手寫 (毛筆):Bash
python script.py -i ./input_bmp -o ./output_svg -c calligraphy(自動帶入-a 0.8 -t 3 -O 0,保留更多細節)
參數邏輯說明:
- roundcap: 平滑度較高 (
1.2),適合圓體字。 - squarecap: 平滑度適中 (
1.0),確保 Noto Sans 的直角與幾何線條不被過度圓化。 - calligraphy: 降低平滑度 (
0.8) 並完全關閉曲線優化 (-O 0),這是為了防止書法筆觸邊緣的墨韻(飛白、毛刺)被抹平成假假的曲線。
| 參數 | 功能 | 建議值 (圓體) | 建議值 (方體) | 建議值 (毛筆) |
-t (turdsize) | 雜點過濾 | 2 | 2 | 3 |
-a (alphamax) | 轉角平滑度 | 1.2 | 1.0 | 0.8 |
-O (opttolerance) | 曲線優化 | 0.2 | 0.2 | 0 |
-n (longcurve) | 關閉長曲線優化 | (不使用) | (不使用) | 可選 (增加細節) |
針對 Noto Serif (明體/襯線體) 以及其他常見字型風格,轉換的核心挑戰在於如何平衡「尖銳的裝飾角 (Serifs)」與「平滑的弧線 (Bowls)」。
以下是為您新增的字型風格建議與參數邏輯分析:
1. 新增字型風格參數建議表
| 風格名稱 | 適用字型 | -a (平滑度) | -t (雜點) | -O (優化) | 邏輯說明 |
serif | Noto Serif, 明體, 宋體 | 0.7 ~ 0.8 | 1 | 0.1 | 襯線體:需要保留橫筆末端的尖銳裝飾與勾筆,較低的 -a 能防止襯線變圓。 |
pixel | 點陣字, 像素風 | 0 | 0 | 0 | 像素感:完全不進行平滑與優化,強制路徑呈現直角階梯狀,100% 還原像素邊緣。 |
condensed | 窄體, 高對比字 | 0.9 | 1 | 0.1 | 高對比:筆畫極細時,-t 必須調小,否則細線會被當成雜訊濾掉。 |
comic | 漫風體, 圓滑手寫 | 1.1 | 2 | 0.2 | 手寫感:介於圓體與方體之間,給予適度的圓潤感但不至於像 ZenMaru 那麼極端。 |
2. 針對 Noto Serif 的深度建議
對於 Noto Serif 這種字體,關鍵在於其「橫細縱粗」與「三角形襯線」:
-a 0.8:如果設為1.2,襯線的尖角會縮進去,變成圓頭;設為0.8可以維持襯線的銳利感。-t 1:襯線體的橫筆通常很細,如果 BMP 解析度不足,較高的-t可能會導致筆畫斷裂。-O 0.1:稍微降低優化容差,能確保複雜的字元細節(如襯線的微小過度)不被簡化。
3. 修改後的 POTRACE_PRESETS 程式碼區塊
您可以將腳本中的字典更新如下,涵蓋更多元的使用情境:
# --- 擴展後的 Potrace 參數預設值 ---
POTRACE_PRESETS = {
"roundcap": ["-a", "1.2", "-t", "2", "-O", "0.2"], # 圓體 (ZenMaru)
"squarecap": ["-a", "1.0", "-t", "2", "-O", "0.2"], # 黑體 (Noto Sans)
"serif": ["-a", "0.8", "-t", "1", "-O", "0.1"], # 襯線 (Noto Serif/明體)
"calligraphy": ["-a", "0.8", "-t", "3", "-O", "0"], # 毛筆 (保留墨跡細節)
"pixel": ["-a", "0", "-t", "0", "-O", "0"], # 像素 (完全直角)
"decorative": ["-a", "0.9", "-t", "1", "-O", "0.1"] # 藝術裝飾 (細節豐富)
}
4. 進階技巧:如何判斷參數是否過頭?
在轉換過程中,您可以觀察 SVG 檔案的以下特徵來微調:
- 襯線變圓了? 降低
-a(例如從0.8降到0.6)。 - 細筆畫消失或斷掉了? 降低
-t(設為0或1)。 - 曲線看起來像多邊形(不夠滑順)? 增加
-a並確保原始 BMP 解析度足夠。 - 節點太多導致檔案很大? 增加
-O(例如設為0.4),這會強迫演算法使用更少的貝茲曲線來擬合。
由於 potrace 再怎麼調, 已經把所有的參數都關掉, [“-a”, “0”, “-t”, “0”, “-O”, “0”, “-u”, “1”] 效果是有比較好, 但還是有缺角的情況發生, 改成 vtracer 效果有比較好, 但 vtracer 也還有是有缺點, 有些細節 potrace 比較好, 整理而言 vtracer 效果優於 potrace.
紅色是 vtrace, 黑色是關閉所有參數的 potrace:
