字的研究(3)fontTools-TrueType輪廓坐標的獲取以及基于TrueType的Glyph實例的構建

前言

本文主要介紹如果使用Python第三方庫fontTools提取OpenType字體文件中的TrueType輪廓坐標以及如何構建基于TrueType的Glyph實例

成都創新互聯,為您提供網站建設公司成都網站制作、網站營銷推廣、網站開發設計,對服務成都衛生間隔斷等多個行業擁有豐富的網站建設及推廣經驗。成都創新互聯網站建設公司成立于2013年,提供專業網站制作報價服務,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發展進步,是我們永遠的責任!

TrueType輪廓坐標的獲取

對于TrueType輪廓描述的OpenType文件,除了前文提到的利用ttx組件將表結構轉化為XML文件方法,利用如下代碼也可以直接獲取具體的輪廓數據:

from fontTools.ttLib import TTFont

font = TTFont("Resources/simsun.ttf")
glyph = font.getGlyphSet()["uni70E0"] # 獲取_TTGlyph實例
print(glyph._glyph.coordinates) # 坐標
print(glyph._glyph.endPtsOfContours) # 輪廓結束點
print(list(glyph._glyph.flags)) # 點類型flag

運行結果如下:

GlyphCoordinates([(138, 118),(138, 86),(206, 86),(206, 118),(138, 80),(138, 49),(206, 49),(206, 80),(138, 43),(138, -19),(123, -26),(124, -5),(124, 16),(124, 99),(110, 81),(86, 67),(84, 70),(118, 100),(142, 158),(125, 158),(112, 158),(101, 155),(92, 164),(144, 164),(154, 192),(156, 209),(176, 197),(169, 192),(161, 170),(159, 164),(207, 164),(221, 177),(238, 158),(157, 158),(151, 142),(140, 124),(205, 124),(214, 134),(229, 119),(220, 114),(220, 1),(220, -17),(199, -25),(197, -9),(168, -4),(168, 0),(195, -2),(206, 0),(206, 8),(206, 43),(52, 206),(74, 194),(67, 187),(67, 123),(87, 148),(91, 161),(105, 147),(99, 146),(90, 137),(81, 128),(67, 115),(67, 91),(64, 57),(87, 46),(103, 29),(103, 22),(103, 18),(99, 7),(92, 9),(87, 22),(82, 34),(63, 52),(56, 8),(12, -26),(11, -23),(41, 13),(53, 74),(53, 149),(33, 140),(34, 126),(33, 104),(25, 92),(13, 88),(10, 95),(10, 97),(10, 102),(14, 105),(19, 109),(28, 128),(29, 140)])
[3, 7, 49, 77, 89]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1]

描述TrueType輪廓的數據主要由坐標、輪廓結束點以及各點的類型flag組成。其中,輪廓結束點為各輪廓的最后一個點的坐標;點類型flag則和坐標一一對應,說明該點是普通點還是貝塞爾曲線的控制點,0為控制點,1為普通點(注意,TrueType輪廓只包含二次貝塞爾曲線)。

相比之下,我個人更傾向將數據轉化為如下由三元組組成的二維數組的形式,更方便理解和處理:

coordinates = list(glyph._glyph.coordinates)
endPts = glyph._glyph.endPtsOfContours
flags = list(glyph._glyph.flags)

contours = []
contour = []
for i, (x,y) in enumerate(coordinates):
    contour.append((x,y,flags[i]))
    if i in endPts:
        contours.append(contour)
        contour = []

print(contours)

運行結果如下:

[[(138, 118, 1), (138, 86, 1), (206, 86, 1), (206, 118, 1)], 
[(138, 80, 1), (138, 49, 1), (206, 49, 1), (206, 80, 1)], 
[(138, 43, 1), (138, -19, 1), (123, -26, 1), (124, -5, 0), (124, 16, 1), (124, 99, 1), (110, 81, 0), (86, 67, 1), (84, 70, 1), (118, 100, 0), (142, 158, 1), (125, 158, 1), (112, 158, 0), (101, 155, 1), (92, 164, 1), (144, 164, 1), (154, 192, 0), (156, 209, 1), (176, 197, 1), (169, 192, 1), (161, 170, 0), (159, 164, 1), (207, 164, 1), (221, 177, 1), (238, 158, 1), (157, 158, 1), (151, 142, 0), (140, 124, 1), (205, 124, 1), (214, 134, 1), (229, 119, 1), (220, 114, 1), (220, 1, 1), (220, -17, 0), (199, -25, 1), (197, -9, 0), (168, -4, 1), (168, 0, 1), (195, -2, 0), (206, 0, 0), (206, 8, 1), (206, 43, 1)], 
[(52, 206, 1), (74, 194, 1), (67, 187, 1), (67, 123, 1), (87, 148, 0), (91, 161, 1), (105, 147, 1), (99, 146, 0), (90, 137, 1), (81, 128, 0), (67, 115, 1), (67, 91, 0), (64, 57, 1), (87, 46, 0), (103, 29, 0), (103, 22, 1), (103, 18, 0), (99, 7, 0), (92, 9, 0), (87, 22, 1), (82, 34, 0), (63, 52, 1), (56, 8, 0), (12, -26, 1), (11, -23, 1), (41, 13, 0), (53, 74, 0), (53, 149, 0)],
[(33, 140, 1), (34, 126, 0), (33, 104, 0), (25, 92, 0), (13, 88, 0), (10, 95, 0), (10, 97, 1), (10, 102, 0), (14, 105, 1), (19, 109, 0), (28, 128, 0), (29, 140, 1)]]

基于TrueType的Glyph實例的構建

構建fontTools中的Glyph實例主要可以用于后續建立新的基于TrueType輪廓的字體文件。所采用的方法是基于前文所提到的Pen對象的子類TTGlyphPointPen,輸入坐標、輪廓結束點以及各點的類型flag三項數據,輸出Glyph實例:

from fontTools.pens.ttGlyphPen import TTGlyphPointPen

coordinates = [(138, 118),(138, 86),(206, 86),(206, 118),(138, 80),(138, 49),(206, 49),(206, 80),(138, 43),(138, -19),(123, -26),(124, -5),(124, 16),(124, 99),(110, 81),(86, 67),(84, 70),(118, 100),(142, 158),(125, 158),(112, 158),(101, 155),(92, 164),(144, 164),(154, 192),(156, 209),(176, 197),(169, 192),(161, 170),(159, 164),(207, 164),(221, 177),(238, 158),(157, 158),(151, 142),(140, 124),(205, 124),(214, 134),(229, 119),(220, 114),(220, 1),(220, -17),(199, -25),(197, -9),(168, -4),(168, 0),(195, -2),(206, 0),(206, 8),(206, 43),(52, 206),(74, 194),(67, 187),(67, 123),(87, 148),(91, 161),(105, 147),(99, 146),(90, 137),(81, 128),(67, 115),(67, 91),(64, 57),(87, 46),(103, 29),(103, 22),(103, 18),(99, 7),(92, 9),(87, 22),(82, 34),(63, 52),(56, 8),(12, -26),(11, -23),(41, 13),(53, 74),(53, 149),(33, 140),(34, 126),(33, 104),(25, 92),(13, 88),(10, 95),(10, 97),(10, 102),(14, 105),(19, 109),(28, 128),(29, 140)]
endPts = [3, 7, 49, 77, 89]
flags = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1]

pen = TTGlyphPointPen(None)
beginflag = 0
for i, pt in enumerate(coordinates):
    if pen._isClosed():
        pen.beginPath()
    if flags[i] == 1:
        pen.addPoint(pt,segmentType="line")
    else:
        pen.addPoint(pt)
    if i in endPts:
        pen.endPath()
glyph = pen.glyph()

返回的glyph即為Glyph實例,可直接用于構建基于TrueType輪廓的字體文件。注意,Glyph對象只包含字形輪廓數據,屬于glyf表,對應前一節提到的_TTGlyph中的_glyph屬性,_TTGlyph中的字寬和上下沿等數據則來自在字體文件的其他表格。

網站題目:字的研究(3)fontTools-TrueType輪廓坐標的獲取以及基于TrueType的Glyph實例的構建
URL分享:http://m.kartarina.com/article22/dsojdcc.html

成都網站建設公司_創新互聯,為您提供網站設計公司網站維護網站內鏈動態網站網站設計微信小程序

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 精品无码久久久久久久动漫 | 免费A级毛片无码久久版 | 日韩精品无码一区二区视频| 内射人妻无码色AV天堂| 国产色爽免费无码视频| 亚洲AV无码国产精品麻豆天美| 无码日韩精品一区二区三区免费| 精品国产aⅴ无码一区二区| 亚洲成a人无码亚洲成www牛牛 | 无码高潮少妇毛多水多水免费| 在线A级毛片无码免费真人| 人妻无码人妻有码中文字幕| 亚洲国产成人精品无码区二本 | 人妻丰满?V无码久久不卡| 久久99久久无码毛片一区二区 | 日韩精品无码Av一区二区| 日日摸日日碰夜夜爽无码| 无码国模国产在线观看| 久久亚洲AV无码精品色午夜 | 2020无码专区人妻系列日韩| 韩国免费a级作爱片无码| 日韩放荡少妇无码视频| 久久久久久国产精品无码超碰| 人妻系列AV无码专区| 亚洲精品无码激情AV| 久久亚洲精品无码网站| 无码乱人伦一区二区亚洲一 | 亚洲成A人片在线观看无码3D| 亚洲精品无码久久久久APP| 亚洲精品~无码抽插| 中文无码不卡的岛国片| 青青草无码免费一二三区| 国产成人无码精品久久久性色| 国产免费久久久久久无码| 欧日韩国产无码专区| 久久久人妻精品无码一区| 欧日韩国产无码专区| 97无码人妻福利免费公开在线视频 | 亚洲av无码专区首页| 亚洲人成人伊人成综合网无码| 亚洲色av性色在线观无码|