3.1.1将WOFF字体文件转换为图像并标注
项目背景
本次操作的目的是为了生成训练数据集,用于训练机器学习模型,使得模型能够自动识别WOFF文件中加密的数字。这是一个非常实用的应用,因为现在很多网站为了防止数据被爬取,会把重要的数字信息(如价格、电话号码等)保存为WOFF文件中的字体。
要完成这样一个目的:首先,我们需要从WOFF文件中提取出每个加密数字的字体轮廓,并将其转换为图像;然后,这些图像会被保存为PNG文件,文件名是每个图像对应的真实数字(这个信息通常可以从WOFF文件的字符映射中获取)。这样,我们就得到了一个大量的、带有标签的图像数据集,可以直接用来训练机器学习模型。
课程目标
在本课程中,你将学习如何使用Python的`fontTools`和`reportlab`库来将WOFF字体文件中的字符转换为图像文件并标注数字。
课程内容
1. 导入必要的模块
首先,我们需要从`fontTools.ttLib`模块中导入`TTFont`类,它可以用来读取和操作TrueType和OpenType字体文件。
from fontTools.ttLib import TTFont
然后,我们从`reportlab.graphics`模块中导入`renderPM`模块,它可以将基于矢量的图形转换为基于像素的图形。
from reportlab.graphics import renderPM
接着,我们从`reportlab.graphics.shapes`模块中导入`Drawing`类,它可以用来创建和操作基于矢量的图形。
from reportlab.graphics.shapes import Drawing
2. 定义转换函数
#我们定义一个名为woff_to_img的函数,这个函数接受一个参数:WOFF文件的路径。
def woff_to_img(woff_path):
#我们创建一个`TTFont`对象,这个对象表示从给定路径加载的字体。
font = TTFont(woff_path)
#我们调用`getBestCmap`方法获取最适合的字符映射,这个映射是一个字典,其中的键是字符的Unicode编码,值是字符的名称。
cmap = font.getBestCmap()
#我们创建一个列表,这个列表包含了字体的一部分字符名称,只选择了名称中包含'uni'的字符。
orders = [i for i in font['glyf'].glyphOrder[1:12] if ('uni' in i)]
#我们创建一个新的映射,这个映射只包含在字符名称列表中的字符。
glyphOrder = {cmap[i]: i for i in cmap if cmap[i] in orders}
#我们创建一个列表,这个列表包含了所有字符对象。
glyphs = [font.getGlyphSet()[order] for order in glyphOrder]
3. 渲染字符为图像并保存
最后,我们将每个字符渲染为图像,并保存为.png文件。
for (order, glyph) in zip(glyphOrder, glyphs):
# 开始一个循环,遍历 glyphOrder(字体顺序)和 glyphs(字体对象)两个列表中的元素。每次循环,都会取出一个字体顺序和一个字体对象。
pen = ReportLabPen(font.getGlyphSet())
# 创建一个 ReportLabPen 对象,该对象可以用来绘制字体轮廓。参数 font.getGlyphSet() 是从字体对象中获取字体集。
glyph.draw(pen)
#调用 draw 方法,将当前的字体轮廓(glyph)绘制到 pen 对象上。
draw = Drawing(glyph.width, glyph.width * 1.6)
# 创建一个 Drawing 对象,其宽度和高度分别是字体轮廓的宽度和宽度的1.6倍。
draw.add(pen.path)
# 调用 draw 方法,将当前的字体轮廓(glyph)绘制到