跳转至

替换与差异

替换

在处理大量字形时,替换操作很是常见。本项目提供了两种替换方式,可以将字形中的某些图案批量替换。

准备图案

在替换字形前,我们需要先准备即将查找、替换的图案。这两种图案使用SearchPatternReplacePattern类的对象表示。

SearchPattern对象存储一个列表,其中的元素只能为01int类型),表示该位置的值。

ReplacePattern对象存储一个列表,其中的元素只能为-101int类型),表示该位置的替换情况。-1表示保持原样,01则表示替换为此值。

Note

图案的宽度、高度都不得大于16像素或小于等于2像素,否则会抛出ValueError异常。

直接初始化

可以直接初始化SearchPatternReplacePattern对象。需要传入上述的列表以及图案的宽度、高度。

传入高度是可选的,如果不传入,则会自动计算高度。

>>> from unifont_utils import SearchPattern, ReplacePattern
>>> p1 = SearchPattern([0, 1, 0, 1, 0, 1], 2)
>>> p2 = ReplacePattern([-1, 1, 1, 0, -1, 1], 2, 3)

从图片初始化

也可以使用其他方式绘制图片,再使用init_from_img方法从图片初始化这两种图案对象。

>>> from unifont_utils import SearchPattern, ReplacePattern
>>> p1 = SearchPattern.init_from_img("path/to/p1.png")
>>> p2 = ReplacePattern.init_from_img("path/to/p2.png")

SearchPattern使用的图片必须为黑、白两色,黑色代表1,白色代表0

ReplacePattern使用的图片必须为黑、白、透明三色,透明代表-1,黑色代表1,白色代表0

Note

“透明”的RGBA值必须为(0, 0, 0, 0),即完全透明,且没有任何颜色。黑色、白色的RGBA值必须为(0, 0, 0, 255)(255, 255, 255, 255),完全不透明。如果图片含有不符合这3种情况的像素,则会抛出ValueError异常。

手动查找图案

可以使用Glyph对象的find_matches方法查找字形中的图案,并获得匹配的坐标列表。列表中的坐标为匹配图案的左上角坐标。

需要传入SearchPattern对象。

>>> glyph.find_matches(p1)

手动覆盖图案

可以使用Glyph对象的apply_pattern方法手动替换字形中某位置的图案。

需要传入覆盖范围左上角的坐标和ReplacePattern对象。

>>> glyph.apply_pattern(2, 3, p2)

单次查找替换

使用Glyph对象的replace方法可以实现单次查找替换。这个方法适合较大的、易于匹配且没有重复的图案。

如果匹配的图案出现超过一次,则剩余的部分将被忽略。

>>> glyph.replace(p1, p2)

交互式查找替换

replace方法只能单次查找替换,并且如果有多个匹配结果,不能指定替换的位置。

遇到这种情况,可以使用GlyphReplacer来交互式替换字形。需要传入Glyph对象和查找、替换所用的图案。

GlyphReplacer

>>> from unifont_utils import GlyphReplacer
>>> GlyphReplacer(glyph, p1, p2).run()

操作方式

GlyphReplacer只能使用键盘操作。

中央为字形和替换效果显示区,上方为该字符的Unicode名称、编码和字符本身,下方为当前选中的匹配序号及匹配结果总数。

按键 名称 解释
A / Left Previous 上一个匹配
D / Right Next 下一个匹配
Space Apply 应用替换
Q / Ctrl+C Quit 退出编辑器
Ctrl+D Toggle Dark Mode 切换浅色/深色模式

每次应用替换后,GlyphReplacer会重新匹配图案,并显示新的匹配结果。

替换完成后,退出编辑器,传入的Glyph对象会自动更新。可以在代码中继续处理替换后的字形。

差异

获取差异

使用diff_glyphs函数可以获取两个字形的差异。传入的字形可以是Glyph对象,也可以是.hex格式字符串。

传入的两个字形必须有相同的尺寸。

>>> from unifont_utils import diff_glyphs
>>> diff = diff_glyphs(glyph1, glyph2)

函数返回一个列表,列表中的元素为str类型,表示对应位置的差异情况。

  • 0:表示两字形该位置都为0
  • 1:表示两字形该位置都为1
  • +:表示字形1该位置为0,字形2该位置为1
  • -:表示字形1该位置为1,字形2该位置为0

打印差异

使用print_diff函数可以查看两个字形的差异。传入的字形可以是Glyph对象,也可以是.hex格式字符串。

传入的两个字形必须有相同的尺寸。

>>> from unifont_utils import print_diff
>>> print_diff(glyph1, glyph2)

下方的差异示例是替换“過”左下方的辵部图案“辶”为“⻎”的结果:

print_diff