在Python中测试一个字形是否是同一字体中另一个字形的反映

kuz*_*roo 0 python fonts glyph python-imaging-library

灵感来自所有unicode的开/关括号的列表?我正在尝试找到给定字体中彼此反射的所有unicode字形的列表.首先,我只需要能够测试一个字形是否是另一个字形的反射.下面我有两个不同的尝试(我的render_char函数的两个不同的实现),但我无法使用任何一个识别'('和')'作为镜像.我怎样才能做到这一点?

from PIL import Image,ImageDraw,ImageFont
import freetype
import numpy as np

def render_char0(c):
    # Based on https://github.com/rougier/freetype-py/blob/master/examples/hello-world.py
    # Needs numpy (blech) and the image comes out the inverse of the way I expect
    face = freetype.Face("/Library/Fonts/Verdana.ttf")
    face.set_char_size( 48*64 )
    face.load_char(c)
    bitmap = face.glyph.bitmap
    w,h = bitmap.width, bitmap.rows
    Z = np.array(bitmap.buffer, dtype=np.ubyte).reshape(h,w)
    return Image.fromarray(Z, mode='L').convert('1')

def render_char1(c):
    # Based on https://stackoverflow.com/a/14446201/2829764
    verdana_font = ImageFont.truetype("/Library/Fonts/Verdana.ttf", 20, encoding="unic")
    text_width, text_height = verdana_font.getsize(c)
    canvas = Image.new('RGB', (text_width+10, text_height+10), (255, 255, 255))
    draw = ImageDraw.Draw(canvas)
    draw.text((5,5), c, font = verdana_font, fill = "#000000")
    return canvas

for render_char in [render_char0, render_char1]:
    lparen = render_char('(')
    rparen = render_char(')')
    mirror = lparen.transpose(Image.FLIP_LEFT_RIGHT)

    mirror.show()
    rparen.show()
    print mirror.tobytes() == rparen.tobytes() # False
Run Code Online (Sandbox Code Playgroud)

roe*_*and 5

BidiMirroring.txt在Unicode纯文本数据库中调用了一个文本文件,其中包含所有镜像字符的列表.该文件很容易被程序解析.

当前网址是http://www.unicode.org/Public/UNIDATA/BidiMirroring.txt

我不认为使用渲染的字形可以可靠地工作.有很多原因,例如.()没有确切的镜像,如字符周围的间距,提示和消除锯齿,可能是字体略微倾斜,或者字体设计师可能只是使两个括号有点不同等.其他字符旋转,而不是镜像,某些字体一样,和中文引号??.