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打开如下: