批次轉換目錄下的 bmp 為 svg 檔

使用外指指令 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 具備以下條件:

  1. 高解析度:BMP 的解析度越高,potrace 計算出的曲線就越精準。
  2. 抗鋸齒處理:在將字體渲染成 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.00.7 ~ 0.8數值低 = 保留更多轉角細節與抖動
-t (turdsize)23 ~ 5視筆觸粗細調整,避免細碎筆墨變雜訊
-O (opt)0.2 (高)0 (關閉)書法字若開啟優化會導致筆鋒變形
-t (threshold)預設0.4 ~ 0.6書法字可微調門檻值來決定墨跡的厚薄

專家建議:如何選擇?

  1. 如果您發現 Noto Sans 的轉角「縮進去」了:請降低 -a0.5 或甚至更低,這會讓它更接近原始像素。
  2. 如果您發現畫法字型的「勾」變得很鈍:這是因為最佳化 (-O) 太強了。請務必確保 -O 設為 0
  3. 解析度是關鍵:無論參數怎麼調,如果 BMP 原始解析度太低,書法字的細節永遠救不回來。建議 BMP 至少要有 1000×1000 px 以上。

增加了 --stroke_cap (縮寫 -c) 參數,並根據你之前的需求,將 「圓形 (roundcap)」「方形 (squarecap)」「毛筆 (calligraphy)」 三種模式對應到建議的 potrace 參數。

如何使用範例:

  1. 轉換 ZenMaruGothic (圓體):Bashpython script.py -i ./input_bmp -o ./output_svg -c roundcap (自動帶入 -a 1.2 -t 2 -O 0.2)
  2. 轉換 Noto Sans (方體):Bashpython script.py -i ./input_bmp -o ./output_svg -c squarecap (自動帶入 -a 1.0 -t 2 -O 0.2)
  3. 轉換 書法/手寫 (毛筆):Bashpython 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)雜點過濾223
-a (alphamax)轉角平滑度1.21.00.8
-O (opttolerance)曲線優化0.20.20
-n (longcurve)關閉長曲線優化(不使用)(不使用)可選 (增加細節)

針對 Noto Serif (明體/襯線體) 以及其他常見字型風格,轉換的核心挑戰在於如何平衡「尖銳的裝飾角 (Serifs)」與「平滑的弧線 (Bowls)」。

以下是為您新增的字型風格建議與參數邏輯分析:


1. 新增字型風格參數建議表

風格名稱適用字型-a (平滑度)-t (雜點)-O (優化)邏輯說明
serifNoto Serif, 明體, 宋體0.7 ~ 0.810.1襯線體:需要保留橫筆末端的尖銳裝飾與勾筆,較低的 -a 能防止襯線變圓。
pixel點陣字, 像素風000像素感:完全不進行平滑與優化,強制路徑呈現直角階梯狀,100% 還原像素邊緣。
condensed窄體, 高對比字0.910.1高對比:筆畫極細時,-t 必須調小,否則細線會被當成雜訊濾掉。
comic漫風體, 圓滑手寫1.120.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 檔案的以下特徵來微調:

  1. 襯線變圓了? 降低 -a (例如從 0.8 降到 0.6)。
  2. 細筆畫消失或斷掉了? 降低 -t (設為 01)。
  3. 曲線看起來像多邊形(不夠滑順)? 增加 -a 並確保原始 BMP 解析度足夠。
  4. 節點太多導致檔案很大? 增加 -O (例如設為 0.4),這會強迫演算法使用更少的貝茲曲線來擬合。

由於 potrace 再怎麼調, 已經把所有的參數都關掉, [“-a”, “0”, “-t”, “0”, “-O”, “0”, “-u”, “1”] 效果是有比較好, 但還是有缺角的情況發生, 改成 vtracer 效果有比較好, 但 vtracer 也還有是有缺點, 有些細節 potrace 比較好, 整理而言 vtracer 效果優於 potrace.

紅色是 vtrace, 黑色是關閉所有參數的 potrace: