Python实现修改字体字形和提取矢量数据

 更新时间:2025年06月05日 09:46:26   作者:东方佑  
字体设计与分析是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 TTGlyphPen

def 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)

关键步骤解析

  • 获取字符映射:通过 cmap 表将Unicode编码映射到字形名称。
  • 遍历所有字符:逐个提取字形的矢量数据。
  • 记录路径数据:使用 RecordingPen 获取字形的路径指令(如 moveTolineTo)。
  • 保存为文本:将所有字符的矢量数据写入文件,便于后续分析。

输出示例

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"
)

四、注意事项

  • 字体兼容性

    • 支持 .ttf 和 .otf 格式,但 OpenType 字体需额外处理。
    • 修改后字体需通过 fontTools 验证:
python -m fontTools.validate modified.ttf
  • 性能优化

    • 处理大字体时,建议分批次处理或使用多线程。
  • 版权问题

    • 修改商业字体需遵守版权协议,开源字体(如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 plt

def plot_glyph(glyph):
    pen = PathPen(glyph)
    glyph.draw(pen)
    path = pen.path
    for element in path:
        vertices = element.vertices
        codes = element.codes
        plt.plot(vertices[:,0], vertices[:,1], marker='o')
    plt.show()

六、总结

通过 fontTools,我们可以直接操作字体的底层矢量数据,实现字形修改、分析和自动化处理。无论是设计个性化字体,还是研究字体结构,这些工具都能提供强大的支持。

以上就是Python实现修改字体字形和提取矢量数据的详细内容,更多关于Python修改字形和提取矢量数据的资料请关注脚本之家其它相关文章!

相关文章

  • 解决TypeError: Object of type xxx is not JSON serializable错误问题

    解决TypeError: Object of type xxx is&

    这篇文章主要介绍了解决TypeError: Object of type xxx is not JSON serializable错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理

    浅析python实现布隆过滤器及Redis中的缓存穿透原理

    本文带你了解了位图的实现,布隆过滤器的原理及 Python 中的使用,以及布隆过滤器如何应对 Redis 中的缓存穿透,相信你对布隆过滤器已经有了一定的认识
    2021-09-09
  • 使用TensorBoard进行超参数优化的实现

    使用TensorBoard进行超参数优化的实现

    这篇文章主要介绍了使用TensorBoard进行超参数优化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python+requests+unittest执行接口自动化测试详情

    Python+requests+unittest执行接口自动化测试详情

    这篇文章主要介绍了Python+requests+unittest执行接口自动化测试详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • Python实战使用XPath采集数据示例解析

    Python实战使用XPath采集数据示例解析

    这篇文章主要为大家介绍了Python实战之使用XPath采集数据实现示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-04-04
  • 基于Python获取亚马逊的评论信息的处理

    基于Python获取亚马逊的评论信息的处理

    这篇文章主要介绍了基于Python获取亚马逊的评论信息的处理方法,用户的评论能直观的反映当前商品值不值得购买,亚马逊的评分信息也能获取到做一个评分的权重,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Python类和方法注释规范说明

    Python类和方法注释规范说明

    这篇文章主要介绍了Python类和方法注释规范说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Python基于机器学习方法实现的电影推荐系统实例详解

    Python基于机器学习方法实现的电影推荐系统实例详解

    这篇文章主要介绍了Python基于机器学习方法实现的电影推荐系统,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • python opencv圆、椭圆与任意多边形的绘制实例详解

    python opencv圆、椭圆与任意多边形的绘制实例详解

    在本篇文章里小编给大家整理的是关于python-opencv-圆、椭圆与任意多边形的绘制内容,需要的朋友们可以学习参考下。
    2020-02-02
  • 如何用Pythony验证万物归一(考拉咨猜想)

    如何用Pythony验证万物归一(考拉咨猜想)

    考拉咨猜想简单的来说,就是你随便给我一个整数,我最后都是会通过固定的规则演变成"1",万物归一.今天我们就用那Python验证一下这个猜想
    2021-06-06

最新评论