跳转至

字形

Glyph

Glyph类用于存储单个字形数据,包括字形的Unicode编码(及名称)、字形的尺寸、字形的位图数据等。

实例化

实例化Glyph类时,需要指定字形的Unicode编码。

>>> from unifont_utils import Glyph
>>> glyph = Glyph("5B57")
>>> glyph = Glyph("5b57")
>>> glyph = Glyph(0x5B57)
>>> glyph = Glyph(23383)

Note

指定的Unicode编码必须为strint类型,否则会抛出TypeError异常。编码也不能超过0x10FFFF(即PUA-B区域的最大编码),否则会抛出ValueError异常。

指定的编码若为str类型,应当使用十六进制表示,大小写不限,不包括前缀“U+”。请确保不要误作十进制。

.hex格式字符串中加载数据

.hex格式字符串

之前我们实例化的Glyph对象都是从Unicode编码直接创建的,没有加载任何字形数据。

我们可以直接从Unifont使用的.hex格式字符串中加载字形数据。

.hex格式字符串是指以十六进制字符串表示的字形数据,从二进制转换而来,便于存储和传输。例如,拉丁字母“A”(U+0041)的.hex格式字符串为:

0041:0000000018242442427E424242420000

如果一一对应,那么它表示的数据就是下面这样的:

00 00000000 --------
00 00000000 --------
00 00000000 --------
00 00000000 --------
18 00011000 ---██---
24 00100100 --█--█--
24 00100100 --█--█--
42 01000010 -█----█-
42 01000010 -█----█-
7E 01111110 -██████-
42 01000010 -█----█-
42 01000010 -█----█-
42 01000010 -█----█-
42 01000010 -█----█-
00 00000000 --------
00 00000000 --------

加载字形数据

如果你已经实例化了一个Glyph对象,可以用load_hex方法从.hex格式字符串中加载字形数据。

>>> glyph = Glyph("5B57")
>>> hex_string = "020001007FFE400280041FE0004000800100FFFE010001000100010005000200"
>>> glyph.load_hex(hex_string)

Note

指定的.hex格式字符串必须为str类型,否则会抛出TypeError异常。并且,.hex格式字符串的长度必须为32或64个字符,不能包含0-9、A-F、a-f以外的字符,否则会抛出ValueError异常。

可以使用init_from_hex方法,在实例化Glyph对象的同时直接加载字形数据。

>>> glyph = Glyph.init_from_hex("5B57", hex_string)

从图片中加载数据

由于创作字体的过程依托于直接修改图片,因此出于效率考虑,Glyph类也提供了从图片中加载字形数据的方法。

提供的路径可以是Path对象,也可以是str类型的文件路径,否则会抛出TypeError异常。

>>> glyph.load_img("path/to/glyph.png")
>>> path = Path("path/to/glyph.png")
>>> glyph.load_img(path)

可以使用init_from_img方法,在实例化Glyph对象的同时直接加载字形数据。

>>> glyph = Glyph.init_from_img("5B57", "path/to/glyph.png")

配色方案

加载图片时会自动检测图片的配色方案,但是不一定准确。如果自动检测的配色方案不正确,可以通过color_scheme参数在load_imginit_from_img方法中指定图片的配色方案。参见配色方案相关说明

>>> glyph.load_img("path/to/glyph.png", color_scheme="transparent_and_white")

获取信息

可以使用Glyph类的一些属性查看字形的相关信息。1

获取对应字符信息

在上述的操作中,glyph对象中存储的字形的Unicode编码为U+5B57,即“字”。

我们可以用code_point属性获取其Unicode编码(以str类型存储):

>>> glyph
Unifont Glyph (U+5B57)
>>> glyph.code_point
5B57

此外,还可以用character属性获取对应的字符,用unicode_name获取查看其Unicode名称:

>>> glyph.character

>>> glyph.unicode_name
CJK UNIFIED IDEOGRAPH-5B57

获取字形数据

可以用hex_str属性获取字形的.hex格式字符串,用data属性获取字形的二进制数据。

>>> glyph.hex_str
020001007FFE400280041FE0004000800100FFFE010001000100010005000200
>>> glyph.data
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

由于Unifont字形的高度必须为16像素,因此Glyph类只存储字形的宽度(8或16像素,以int类型存储)。可以用width属性获取字形的宽度。

>>> glyph.width
16

在控制台中打印字形

可以使用print_glyph方法在控制台中直接打印字形,以便在不保存图片的情况下快速查看目前存储的字形。

要使用这一功能,你的终端必须支持ANSI转义序列。请注意,Windows上的Win32控制台不支持ANSI转义序列,请使用**支持ANSI转义序列的终端**(如Windows Terminal)或**适用于Linux的Windows子系统**(WSL),否则可能无法正常显示字形。

>>> glyph.print_glyph()

Sample 1

print_glyph方法还提供显示每一行对应的十六进制和二进制字符串的功能,可以用display_hexdisplay_bin参数控制。

>>> glyph.print_glyph(display_hex=True, display_bin=True)

Sample 2

如果你是从图片中加载的字形数据,这里的配色方案也会自动继承加载图片时指定的color_scheme参数的值。由于终端不可能像图片那样有“透明”的概念,如果使用背景为透明的配色方案,背景色会被处理为前景色的反色。

当然,你也可以手动给print_glyph方法指定color_scheme参数,以覆盖默认值。

>>> glyph.print_glyph(color_scheme="transparent_and_white")

Sample 3

将字形保存为图片

无论你以何种方式在Glyph对象中存储了字形数据,都可以用save_img方法将字形保存为图片。

提供的路径可以是Path对象,也可以是str类型的文件路径,否则会抛出TypeError异常。

>>> glyph.save_img("path/to/save.png")
>>> path = Path("path/to/save.png")
>>> glyph.save_img(path)

图片格式可以为PNG或BMP,默认使用PNG格式。如果需要使用BMP格式,请指定img_format参数为BMPbmp

>>> glyph.save_img("path/to/save.bmp", img_format="BMP")

如果你是从图片中加载的字形数据,那么Glyph对象中会存储当时指定的color_scheme参数的值。在保存为图片时,会自动继承这个值来决定以何种形式保存图片——换句话说,配色和加载图片时保持一致。

当然,你也可以手动给save_img方法指定color_scheme参数,以覆盖默认值。

>>> glyph.save_img("path/to/save.png", color_scheme="transparent_and_white")

Warning

由于BMP格式不能保存透明度信息,如果指定的图片格式为BMP,图片的透明度信息会被忽略,背景色会被处理为前景色的反色。


  1. 文中提到的部分“属性”实际上是特性(Property),为了方便起见,文中不做区分,仅在必要的时候作出说明。