用Python修改字體字形與提取矢量數據:fontTools實戰指南

字體設計與分析是NLP和視覺領域的交叉應用,而**fontTools** 是一款強大的Python庫,可以讓我們直接操作字體文件的底層結構。本文將通過兩個實用函數,展示如何修改特定字形提取所有字形的矢量數據,幫助開發者快速上手字體編輯與分析。


一、函數1:修改字體字形(change_glyph

功能
  • 將字體文件中指定字形(如"A")替換為新的矢量輪廓。
代碼實現
from fontTools.pens.transformPen import TransformPen
from fontTools.ttLib import TTFont
from fontTools.pens.recordingPen import RecordingPen
from fontTools.pens.ttGlyphPen import TTGlyphPendef change_glyph(font_path, glyph_name, new_glyph_path):# 加載字體文件font = TTFont(font_path)# 獲取 glyf 表glyf_table = font['glyf']# 確保字形存在if glyph_name in glyf_table.glyphs:# 記錄原始輪廓(可選,用于對比)recording_pen = RecordingPen()glyf_table[glyph_name].draw(recording_pen, font)# 創建新輪廓new_glyph_pen = TTGlyphPen(font.getGlyphSet())# 定義新輪廓(此處為一個簡單的矩形)new_glyph_pen.moveTo((100, 100))new_glyph_pen.lineTo((200, 100))new_glyph_pen.lineTo((200, 200))new_glyph_pen.lineTo((100, 200))new_glyph_pen.closePath()# 替換字形glyf_table[glyph_name] = new_glyph_pen.glyph()# 保存修改后的字體font.save(new_glyph_path)else:print(f"字形 '{glyph_name}' 不存在!")
關鍵步驟解析
  1. 加載字體:通過 TTFont 加載字體文件。
  2. 獲取 glyf 表glyf 表存儲字形的矢量輪廓數據。
  3. 記錄原始輪廓:使用 RecordingPen 記錄原始字形的路徑數據(可選)。
  4. 生成新輪廓:通過 TTGlyphPen 定義新輪廓的坐標點(如矩形)。
  5. 替換并保存:將新輪廓寫入 glyf 表,并保存為新字體文件。
應用場景
  • 自定義字體設計:修改特定字符的形狀(如Logo字體)。
  • 修復字體缺陷:調整模糊或不規則的字形。

二、函數2:提取所有字形矢量數據(extract_all_glyph_vector_data

功能
  • 遍歷字體中所有字符,提取其矢量路徑數據并保存為文本文件。
代碼實現
def extract_all_glyph_vector_data(font_path, output_file):font = TTFont(font_path)cmap = font.getBestCmap()  # 字符編碼到字形名的映射glyph_set = font.getGlyphSet()file_content = ""for char_code, glyph_name in cmap.items():glyph = glyph_set[glyph_name]pen = RecordingPen()transform_pen = TransformPen(pen, (1, 0, 0, 1, 0, 0))  # 無變換glyph.draw(transform_pen)# 格式化輸出character = chr(char_code) if char_code <= 0x10FFFF else f"U+{char_code:04X}"data = f"Character: {character} (U+{char_code:04X})\nVector Data: {pen.value}\n\n"file_content += data# 保存到文件with open(output_file, "w", encoding="utf-8") as f:f.write(file_content)
關鍵步驟解析
  1. 獲取字符映射:通過 cmap 表將Unicode編碼映射到字形名稱。
  2. 遍歷所有字符:逐個提取字形的矢量數據。
  3. 記錄路徑數據:使用 RecordingPen 獲取字形的路徑指令(如 moveTo, lineTo)。
  4. 保存為文本:將所有字符的矢量數據寫入文件,便于后續分析。
輸出示例
Character: A (U+0041)
Vector Data:
MoveTo((100, 200))
LineTo((300, 200))
LineTo((200, 400))
ClosePath()
應用場景
  • 字體逆向工程:分析字體設計邏輯或版權問題。
  • 自動化處理:批量提取字形數據用于機器學習訓練。

三、使用示例

# 修改字體中的"A"字形
change_glyph(font_path="simsun.ttf",      # 輸入字體路徑glyph_name="A",              # 目標字形名稱new_glyph_path="modified.ttf" # 輸出路徑
)# 提取所有字形數據
extract_all_glyph_vector_data(font_path="simsun.ttf", output_file="simsun_vectors.txt"
)

四、注意事項

  1. 字體兼容性

    • 支持 .ttf.otf 格式,但 OpenType 字體需額外處理。
    • 修改后字體需通過 fontTools 驗證:
      python -m fontTools.validate modified.ttf
      
  2. 性能優化

    • 處理大字體時,建議分批次處理或使用多線程。
  3. 版權問題

    • 修改商業字體需遵守版權協議,開源字體(如Google Fonts)更易操作。

五、擴展功能

1. 轉換坐標系

通過 TransformPen 可以對字形進行縮放、旋轉等變換:

# 縮放字形為原尺寸的50%
scale = 0.5
transform = (scale, 0, 0, scale, 0, 0)
transform_pen = TransformPen(pen, transform)
2. 可視化字形

使用 matplotlib 可視化字形輪廓:

import matplotlib.pyplot as pltdef plot_glyph(glyph):pen = PathPen(glyph)glyph.draw(pen)path = pen.pathfor element in path:vertices = element.verticescodes = element.codesplt.plot(vertices[:,0], vertices[:,1], marker='o')plt.show()

六、總結

通過 fontTools,我們可以直接操作字體的底層矢量數據,實現字形修改、分析和自動化處理。無論是設計個性化字體,還是研究字體結構,這些工具都能提供強大的支持。立即嘗試,探索字體設計的新可能!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77568.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77568.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77568.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows 11 PowerShell重定向文本文件的編碼問題

目錄 問題的由來 編碼導致的問題 解決辦法 VSCode進行轉換 記事本進行轉換 直接指定輸出的文本編碼 總結 問題的由來 在我的嵌入式系統的課程中有一個裸機開發的實驗&#xff0c;其中需要把圖片等文件轉換為C語言數組保存在程序中。課程中&#xff0c;我推薦了CodePlea的…

SQL開發的智能助手:通義靈碼在IntelliJ IDEA中的應用

SQL 是一種至關重要的數據庫操作語言&#xff0c;盡管其語法與通用編程語言有所不同&#xff0c;但因其在眾多應用中的廣泛使用&#xff0c;大多數程序員都具備一定的 SQL 編寫能力。然而&#xff0c;當面對復雜的 SQL 語句或優化需求時&#xff0c;往往需要專業數據庫開發工程…

算法——分支限界

學習目標&#xff1a; 掌握算法入門知識 學習內容&#xff1a; 分支限界的定義例題詳細步驟講解&#xff08;找牛&#xff09; 1. 分支限界的定義 分支限界法是一種用于求解 組合優化問題 的算法框架&#xff0c;通過 系統性地搜索解空間樹&#xff0c;并結合 剪枝策略 來避…

對接日本金融市場數據全指南:K線、實時行情與IPO新股

一、日本金融市場特色與數據價值 日本作為全球第三大經濟體&#xff0c;其金融市場具有以下顯著特點&#xff1a; 成熟穩定&#xff1a;日經225指數包含日本頂級藍籌股獨特交易時段&#xff1a;上午9:00-11:30&#xff0c;下午12:30-15:00&#xff08;JST&#xff09;高流動性…

解決opencv中文路徑問題

見cv_imread函數和cv_imwrite函數 import cv2 import os import matplotlib.pyplot as plt from paddleocr import PaddleOCR, draw_ocr import numpy as np import urllib.parse # Add this import statementfrom txt_get import ImageTextExtractor# 初始化OCR&#xff0c;…

Linux中的Vim與Nano編輯器命令詳解

&#x1f4e2; 友情提示&#xff1a; 本文由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;平臺gpt-4-turbo模型輔助創作完成&#xff0c;旨在提供靈感參考與技術分享&#xff0c;文中代碼與命令建議通過官方渠道驗證。 在Linux系統中&#xff0c;文本編輯是最常用的…

寶馬集團加速 ERP 轉型和上云之旅

寶馬集團&#xff08;BMW Group&#xff09;作為全球領先的豪華汽車和摩托車制造商&#xff0c;致力于構建更加智能、綠色、人性化的出行體驗。為了支持其全球化、數字化業務戰略&#xff0c;寶馬集團正在進行大規模的 IT 體系升級和 ERP 云轉型。該項目以“RISE with SAP S/4H…

大數據學習(105)-Hbase

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

【數學建模】

全國大學生數學建模競賽(CUMCM)歷年試題速瀏(查看超級方便)_全國大學生數學建模競賽真題-CSDN博客 高教社杯全國大學生數學建模競賽歷年賽題&#xff08;含解析、評閱&#xff09; - 賽氪教育 年份 賽題 真題 問題類型 對應算法及模型 2023年 A題 定日鏡場的優化設計 …

【Python語言基礎】18、多態

文章目錄 1. 多態1.1 什么是多態1.2 多態實現方式1.3 多態的好處1.4 多態的好處1.5 不同層面的理解1.6 多態的優缺點 1. 多態 在 Python 里&#xff0c;多態是一種非常有用的編程特性&#xff0c;它能讓你以統一的方式處理不同類型的對象 1.1 什么是多態 多態就好比在生活中…

AI多模態論文解讀:OmniCaptioner:多領域視覺描述生成框架(附腦圖)

AIGCmagic社區知識星球是國內首個以AIGC全棧技術與商業變現為主線的學習交流平臺&#xff0c;涉及AI繪畫、AI視頻、大模型、AI多模態、數字人以及全行業AIGC賦能等100應用方向。星球內部包含海量學習資源、專業問答、前沿資訊、內推招聘、AI課程、AIGC模型、AIGC數據集和源碼等…

Spring IoC深度解析:掌控Bean存儲藝術與分層架構的智慧??

一、IoC的本質&#xff1a;從"造物主"到"使用者"的思維躍遷 在傳統編程中&#xff0c;開發者像"造物主"一樣親手創建每個對象&#xff08;new UserController()&#xff09;&#xff0c;并管理它們的依賴關系。這種方式導致代碼高度耦合&#xf…

ubuntu22.04下安裝mysql以及mysql-workbench

一、mysql安裝以及配置 安裝之前先查看是否已將安裝mysql: rpm -qa | grep mysql (一)、在線安裝 保證網絡正常的情況下: 1、更新軟件包: sudo apt update 2、安裝mysql安裝包 查看可以安裝的安裝包: sudo apt search mysql-server 安裝指定安裝包: sudo apt i…

第二屆數字圖像處理與計算機應用國際學術會議(DIPCA 2025)

重要信息 時間&#xff1a;2025年4月25-27日 地點&#xff1a;中國-西安 官網&#xff1a;www.icipca.net&#xff08;了解詳情&#xff09; 部分展示 征稿主題 包括但不限于&#xff1a; 圖像處理&#xff1a;模式識別、計算機視覺、低級視覺和圖像處理、光學技術在圖像中的…

【后端開發】Spring MVC階段總結

文章目錄 快捷引入依賴lombok的使用Lombok依賴Lombok使用Lombok注解 三層架構分層的目的MVC與分層的區別三層架構分層的好處 企業命名規范常見命名命名風格介紹大駝峰風格小駝峰風格包名 常見注解Cookie與Session 快捷引入依賴 這個方法可以快捷引入依賴&#xff0c;但是引入依…

FastAPI依賴注入系統及調試技巧

title: FastAPI依賴注入系統及調試技巧 date: 2025/04/11 15:00:50 updated: 2025/04/11 15:00:50 author: cmdragon excerpt: FastAPI的依賴注入系統采用樹狀結構管理依賴關系,自動解析并執行依賴項。復雜依賴關系可能導致循環依賴、性能問題、邏輯錯誤和調試困難。使用Fa…

DeepSeek賦能!企業私有化知識庫3大搭建方案拆解

最近公司要搭建一個私有化的知識庫&#xff0c;通過對比分析&#xff0c;發現企業級私有化知識庫搭建有多種方案選型&#xff0c;今天就分享下這幾種企業私有化知識庫搭建方案。 一、為何選擇本地部署&#xff1f; 這個分個人還是企業&#xff0c;如果個人用&#xff0c;其實各…

對稱加密與非對稱加密與消息摘要算法保證https的數據交互的完整性和保密性

一、對稱加密與非對稱加密的作用 1. 對稱加密 作用&#xff1a; 保密性&#xff1a;對稱加密使用相同的密鑰對數據進行加密和解密&#xff0c;確保數據在傳輸過程中不被竊聽。效率&#xff1a;對稱加密算法&#xff08;如AES&#xff09;計算速度快&#xff0c;適合加密大量數…

程序化廣告行業(76/89):行業融資全景剖析與代碼應用拓展

程序化廣告行業&#xff08;76/89&#xff09;&#xff1a;行業融資全景剖析與代碼應用拓展 大家好&#xff01;在之前的文章里&#xff0c;咱們一起了解了程序化廣告行業的發展趨勢以及PC端和移動端投放的差異。今天&#xff0c;咱們接著深入學習&#xff0c;這次聚焦在程序化…

兩個樹莓派如何通過wifi direct傳輸視頻并顯示

這里寫自定義目錄標題 在兩臺設備上安裝必要軟件Wi-Fi Direct接收端IP&#xff08;自動發現或靜態設置&#xff09;設置攝像頭參數顯示初始化網絡設置 系統架構概述 發送端樹莓派&#xff1a;捕獲視頻&#xff08;攝像頭或視頻文件&#xff09;→ 編碼 → 通過Wi-Fi Direct傳輸…