Bearbeiten Sie Schriftarten in Python

Einführung

Ich habe eine Schriftart namens M + A1 basierend auf M + FONTS in Python erstellt. (https://microraptor.booth.pm/items/2347968) Ich werde das Verfahren zum programmgesteuerten Lesen und Schreiben von Schriften mit der Bedeutung von Memorandum und Missionsarbeit erläutern.

Was du machen willst

Da es nicht möglich ist, OTF (Open Type) plötzlich zu lesen, schreiben Sie es im UFO-Format (Unified Font Object) und lesen Sie dann die Datei, um OTF zu erstellen.

Was ist UFO? Es wird sein, aber es ist nicht schwierig. Es ist nur eine XML-Datei. Die Kontrollpunkte der Bezier-Kurven, aus denen die Schriftdaten bestehen, werden als XML exportiert.

OTF -> UFO Erstellen Sie mit defcon ein Font-Objekt und exportieren Sie es mit extractUFO nach OTF-> UFO.


import defcon
import extractor

IMPORT_FILE = r'C:\example\abc.otf'
EXPORT_FILE = r'C:\example\abc_ufo'
font = defcon.Font()
extractor.extractUFO(IMPORT_FILE, font)
font.save(EXPORT_FILE)

Der Export kann für westliche Sprachen in wenigen Sekunden und für japanische Schriftarten in wenigen Minuten erfolgen.

Ausgabeergebnis

lib.plist und content.plist sind ähnliche Dateien, sodass Sie auf eine der beiden Dateien verweisen können. (In Lib.plist sind kein Schriftartname und keine Schriftartdatei verknüpft, aber der Schriftartname wird auch in jede .gilf geschrieben. Contents.plist ist in einer großen Anzahl von .gilf vorhanden, daher ist es schwierig, ihn zu finden. Ich denke es ist egal welches.)

UFO -> OTF

import os
import defcon
import ufo2ft
from xml.etree import ElementTree as ET

# Const
UFO_FILE = r'C:\example\abc_ufo'
GLIF_PATH = os.path.join(UFO_FILE, 'glyphs')

font = defcon.Font()

#Wählen Sie das zu bearbeitende Zeichen aus
glif_root = ET.parse(os.path.join(GLIF_PATH, 'a.glif'))
glyph = font.newGlyph('a')
glyph.unicode = int(glif_root.find('.//unicode').attrib['hex'], 16)
contour_list = glif_root.findall('.//contour')

#Aus der Glif-Datei<contour>Untergeordnet<point>Tags nacheinander lesen
for tag_contour in contour_list:
    contour = defcon.Contour()
    point_list = tag_contour.findall('./point')

    for k, v in enumerate(point_list):
        # <point>Keine, wenn Typ nicht in definiert ist
        _type = v.attrib['type'] if 'type' in v.attrib else None
        #Sollwerte
        contour.appendPoint(
            defcon.Point(
                (int(v.attrib['x']), int(v.attrib['y'])),
                segmentType=_type,
            )
        )
    #Stellen Sie die Kontur für eine Runde ein
    glyph.appendContour(contour)

#Export nach OTF
otf = ufo2ft.compileOTF(font)
otf.save('new_font.otf')

Dadurch wird eine Schriftartdatei mit nur "a" ausgegeben. Sie können Ihre eigene Schriftart erstellen, indem Sie den Pfad bearbeiten und dann schreiben.

Referenz / Referenzmaterial

UFO-Beamter: https://unifiedfontobject.org/ DEFCON : https://defcon.robotools.dev/en/latest/ https://qiita.com/irori/items/5518c242e0244838783b https://blog.hgrs.me/20190806022544 https://irori.github.io/wapuro-mincho/

Recommended Posts

Bearbeiten Sie Schriftarten in Python
Quadtree in Python --2
Python in der Optimierung
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 18 in Python
Singleton-Muster in Python
Dateioperationen in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python
Tastenanschlag in Python
Verwenden Sie config.ini mit Python
Täglicher AtCoder # 33 in Python
Löse ABC168D in Python
Logistische Verteilung in Python
Täglicher AtCoder # 7 in Python
LU-Zerlegung in Python