Тестирование в Python, является ли один глиф отражением другого в том же шрифте

Вдохновленный списком всех открывающих/закрывающих скобок 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

person kuzzooroo    schedule 04.10.2015    source источник
comment
Я думаю, что рендеринг - неправильный подход. Это зависит от шрифта и от того, умеет ли font отображать эту симметрию. Я слышал, что у символов Юникода есть спецификация для этого. Возможно, это зашифровано в их имени. ЛЕВАЯ и ПРАВАЯ ПОДПИСКА. Взгляните на xahlee.info/comp/unicode_matching_brackets.html.   -  person User    schedule 05.10.2015


Ответы (2)



Я думаю, что рендеринг - неправильный подход. Это зависит от шрифта и от того, умеет ли шрифт отображать это. Я слышал, что символы Юникода имеют спецификацию для этой симметрии. Возможно, это зашифровано в их имени. «ЛЕВАЯ» и «ПРАВАЯ» «ПОДПИСКА». Взгляните на http://xahlee.info/comp/unicode_matching_brackets.html.

person User    schedule 04.10.2015