Python 3.10 将 ttf 字体 ,转换为图片,不过转换的是多张
from fontTools.ttLib import TTFont
from reportlab.graphics import renderPM
from reportlab.graphics.shapes import Group, Drawing
from reportlab.lib import colors
from reportlab.graphics.shapes import Path
from ttf_convert_img import ReportLabPen
def ttfToImage(fontName, imagePath, fmt="png"):
font = TTFont(fontName)
gs = font.getGlyphSet()
glyphNames = font.getGlyphNames()
for i in glyphNames:
if i[0] == '.': # 跳过'.notdef', '.null'
continue
g = gs[i]
pen = ReportLabPen(gs, Path(fillColor=colors.red, strokeWidth=5))
g.draw(pen)
w = 640
h = 640
g = Group(pen.path)
g.translate(0, 0)
d = Drawing(w, h)
d.add(g)
imageFile = imagePath + "/" + i + ".png"
renderPM.drawToFile(d, imageFile, fmt)
print(i)
if __name__ == "__main__":
ttfToImage(fontName="D:\\test\\26款手写英文字体 [STYLE]S.TTF", imagePath="D:\\test")
下面是 ttf_convert_img 文件的 ReportLabPen 类
from __future__ import print_function, division, absolute_import
from fontTools.pens.basePen import BasePen
from reportlab.graphics.shapes import Path
class ReportLabPen(BasePen):
"""A pen for drawing onto a reportlab.graphics.shapes.Path object."""
def __init__(self, glyphSet, path=None):
BasePen.__init__(self, glyphSet)
if path is None:
path = Path()
self.path = path
def _moveTo(self, p):
(x, y) = p
self.path.moveTo(x, y)
def _lineTo(self, p):
(x, y) = p
self.path.lineTo(x, y)
def _curveToOne(self, p1, p2, p3):
(x1, y1) = p1
(x2, y2) = p2
(x3, y3) = p3
self.path.curveTo(x1, y1, x2, y2, x3, y3)
def _closePath(self):
self.path.closePath()
程序生成的图片如下:
Windows打开如下: