文章目录
- 将字体文件中指定字形(如"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}’ 不存在!”)
- 加载字体:通过 TTFont 加载字体文件。 获取 glyf 表:glyf 表存储字形的矢量轮廓数据。 记录原始轮廓:使用 RecordingPen 记录原始字形的路径数据(可选)。 生成新轮廓:通过 TTGlyphPen 定义新轮廓的坐标点(如矩形)。 替换并保存:将新轮廓写入 glyf 表,并保存为新字体文件。
- 自定义字体设计:修改特定字符的形状(如Logo字体)。 修复字体缺陷:调整模糊或不规则的字形。
- 遍历字体中所有字符,提取其矢量路径数据并保存为文本文件。
- 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}nn” file_content += data # 保存到文件 with open(output_file, “w”, encoding=”utf-8″) as f: f.write(file_content)
- 获取字符映射:通过 cmap 表将Unicode编码映射到字形名称。 遍历所有字符:逐个提取字形的矢量数据。 记录路径数据:使用 RecordingPen 获取字形的路径指令(如 moveTo, lineTo)。 保存为文本:将所有字符的矢量数据写入文件,便于后续分析。
- Character: A (U+0041) Vector Data: MoveTo((100, 200)) LineTo((300, 200)) LineTo((200, 400)) ClosePath()
- 字体逆向工程:分析字体设计逻辑或版权问题。 自动化处理:批量提取字形数据用于机器学习训练。
- 通过 TransformPen 可以对字形进行缩放、旋转等变换: # 缩放字形为原尺寸的50% scale = 0.5 transform = (scale, 0, 0, scale, 0, 0) transform_pen = TransformPen(pen, transform)
- 使用 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()
目录
- 一、函数1:修改字体字形(change_glyph)
- 功能
- 代码实现
- 关键步骤解析
- 应用场景
- 二、函数2:提取所有字形矢量数据(extract_all_glyph_vector_data)
- 功能
- 代码实现
- 关键步骤解析
- 输出示例
- 应用场景
- 三、使用示例
- 四、注意事项
- 五、扩展功能
- 1. 转换坐标系
- 2. 可视化字形
- 六、总结
- 将字体文件中指定字形(如"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}' 不存在!")
- 加载字体:通过
TTFont 加载字体文件。
- 获取 glyf 表:
glyf 表存储字形的矢量轮廓数据。
- 记录原始轮廓:使用
RecordingPen 记录原始字形的路径数据(可选)。
- 生成新轮廓:通过
TTGlyphPen 定义新轮廓的坐标点(如矩形)。
- 替换并保存:将新轮廓写入
glyf 表,并保存为新字体文件。
TTFont 加载字体文件。glyf 表存储字形的矢量轮廓数据。RecordingPen 记录原始字形的路径数据(可选)。TTGlyphPen 定义新轮廓的坐标点(如矩形)。glyf 表,并保存为新字体文件。
- 自定义字体设计:修改特定字符的形状(如Logo字体)。
- 修复字体缺陷:调整模糊或不规则的字形。
- 遍历字体中所有字符,提取其矢量路径数据并保存为文本文件。
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}nn"
file_content += data
# 保存到文件
with open(output_file, "w", encoding="utf-8") as f:
f.write(file_content)
- 获取字符映射:通过
cmap 表将Unicode编码映射到字形名称。
- 遍历所有字符:逐个提取字形的矢量数据。
- 记录路径数据:使用
RecordingPen 获取字形的路径指令(如 moveTo, lineTo)。
- 保存为文本:将所有字符的矢量数据写入文件,便于后续分析。
cmap 表将Unicode编码映射到字形名称。RecordingPen 获取字形的路径指令(如 moveTo, lineTo)。
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)更易操作。
字体兼容性:
- 支持
.ttf和.otf格式,但 OpenType 字体需额外处理。 - 修改后字体需通过
fontTools验证:
性能优化:
- 处理大字体时,建议分批次处理或使用多线程。
版权问题:
- 修改商业字体需遵守版权协议,开源字体(如Google Fonts)更易操作。
通过 TransformPen 可以对字形进行缩放、旋转等变换:
# 缩放字形为原尺寸的50% scale = 0.5 transform = (scale, 0, 0, scale, 0, 0) transform_pen = TransformPen(pen, transform)
使用 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修改字形和提取矢量数据的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Python 点集排序之带索引的Z字形排序算法实现代码
- 使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)
- python中openpyxl库设置表格样式之字体/边框/对齐/颜色等
- Python在Excel单元格中应用多种字体样式的代码示例
- python使用openpyxl实现批量调整字体和样式