字形
Glyph类
Glyph类用于存储单个字形数据,包括字形的Unicode编码(及名称)、字形的尺寸、字形的位图数据等。
实例化
实例化Glyph类时,需要指定字形的Unicode编码。
>>> from unifont_utils import Glyph
>>> glyph = Glyph("5B57")
>>> glyph = Glyph("5b57")
>>> glyph = Glyph(0x5B57)
>>> glyph = Glyph(23383)
Note
指定的Unicode编码必须为str或int类型,否则会抛出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_img或init_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()

print_glyph方法还提供显示每一行对应的十六进制和二进制字符串的功能,可以用display_hex和display_bin参数控制。
>>> glyph.print_glyph(display_hex=True, display_bin=True)

如果你是从图片中加载的字形数据,这里的配色方案也会自动继承加载图片时指定的color_scheme参数的值。由于终端不可能像图片那样有“透明”的概念,如果使用背景为透明的配色方案,背景色会被处理为前景色的反色。
当然,你也可以手动给print_glyph方法指定color_scheme参数,以覆盖默认值。
>>> glyph.print_glyph(color_scheme="transparent_and_white")

将字形保存为图片
无论你以何种方式在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参数为BMP或bmp。
>>> 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,图片的透明度信息会被忽略,背景色会被处理为前景色的反色。
-
文中提到的部分“属性”实际上是特性(Property),为了方便起见,文中不做区分,仅在必要的时候作出说明。 ↩