Написание текста с диакритическими знаками («никуд», вокализационные знаки) с использованием PIL (Python Imaging Library) - PullRequest
7 голосов
/ 14 июня 2009

Написание простого текста на изображении с помощью PIL легко.

draw = ImageDraw.Draw(img)
draw.text((10, y), text2, font=font, fill=forecolor )

Однако, когда я пытаюсь написать знаки препинания на иврите (называемые «никуда» или «ניקוד»), символы не перекрываются, как должны. (Я полагаю, что этот вопрос относится также к арабскому и другим подобным языкам.)

В поддерживающей среде эти два слова занимают одинаковое пространство / ширину (приведенный ниже пример зависит от вашей системы, а значит и от изображения):

סֶפֶר ספר

Однако при рисовании текста с помощью PIL я получаю:

ס ֶ פ ֶ ר

поскольку библиотека, вероятно, не подчиняется правилам кернинга (?).

Возможно ли, чтобы символ и знак препинания на иврите занимали одинаковое пространство / ширину без ручного ввода положения символа?

изображение - никуд и межбуквенный интервал http://tinypic.com/r/jglhc5/5

URL-адрес изображения: http://tinypic.com/r/jglhc5/5

Ответы [ 4 ]

8 голосов
/ 08 сентября 2014

Что касается арабских диакритических знаков: Python + Wand (Python Lib) + arabic_reshaper (Python Lib) + bidi.algorithme (Python Lib). То же самое относится к PIL / Pillow , вам нужно использовать arabic_reshaper и bidi.algorithm и передавать сгенерированный текст в draw.text((10, 25), artext, font=font):

from wand.image import Image as wImage
from wand.display import display as wdiplay
from wand.drawing import Drawing
from wand.color import Color
import arabic_reshaper
from bidi.algorithm import get_display

reshaped_text = arabic_reshaper.reshape(u'لغةٌ عربيّة')
artext = get_display(reshaped_text)

fonts = ['C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\DroidNaskh-Bold.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Bold-Oblique.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Bold.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Oblique.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\majalla.ttf',         
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\majallab.ttf',

         ]
draw = Drawing()
img =  wImage(width=1200,height=(len(fonts)+2)*60,background=Color('#ffffff')) 
#draw.fill_color(Color('#000000'))
draw.text_alignment = 'right';
draw.text_antialias = True
draw.text_encoding = 'utf-8'
#draw.text_interline_spacing = 1
#draw.text_interword_spacing = 15.0
draw.text_kerning = 0.0
for i in range(len(fonts)):
    font =  fonts[i]
    draw.font = font
    draw.font_size = 40
    draw.text(img.width / 2, 40+(i*60),artext)
    print draw.get_font_metrics(img,artext)
    draw(img)
draw.text(img.width / 2, 40+((i+1)*60),u'ناصر test')
draw(img)
img.save(filename='C:\\PATH\\OUTPUT\\arabictest.png'.format(r))
wdiplay(img)

Arabic typography in images

2 голосов
/ 09 сентября 2014

Забавно, через 5 лет и с большой помощью @Nasser Al-Wohaibi я понял, как это сделать:

Требуется реверсирование текста по алгоритму BIDI.

# -*- coding: utf-8 -*-
from bidi.algorithm import get_display
import PIL.Image, PIL.ImageFont, PIL.ImageDraw
img= PIL.Image.new("L", (400, 200))
draw = PIL.ImageDraw.Draw(img)
font = PIL.ImageFont.truetype( r"c:\windows\fonts\arial.ttf", 30)
t1 = u'סֶפֶר ספר!'
draw.text( (10,10), 'before BiDi :' + t1, fill=255, font=font)

t2 = get_display(t1)        # <--- here's the magic <---
draw.text( (10,50), 'after BiDi: ' + t2, fill=220, font=font)

img.save( 'bidi-test.png')

@ Ответ Насера ​​имеет дополнительное значение, которое, вероятно, относится только к арабским текстам (буквы в арабском языке изменяют форму и связность, основанные на их соседних буквах, на иврите все буквы разделены), поэтому для этого была важна только часть биди вопрос.

в результате выборки, 2-я строка - правильная форма и правильное расположение меток вокализации.

before and after bidi

спасибо @tzot за помощь + фрагменты кода

а-ргороз:

образцы поведения различных шрифтов с ивритским "никудом". Не все шрифты ведут себя одинаково: sample PIL written, bidi hebrew text, with nikud, in different fonts

2 голосов
/ 20 июня 2009

На какой системе вы работаете? Это работает для меня в моей системе Gentoo; порядок букв обратный (я только что скопировал из твоего вопроса), что мне кажется правильным, хотя я не очень разбираюсь в языках RTL.

Python 2.5.4 (r254:67916, May 31 2009, 16:56:01)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Image as I, ImageFont as IF, ImageDraw as ID
>>> t= u"סֶפֶר ספר"
>>> t
u'\u05e1\u05b6\u05e4\u05b6\u05e8 \u05e1\u05e4\u05e8'
>>> i= I.new("L", (200, 200))
>>> d= ID.Draw(i)
>>> f= IF.truetype("/usr/share/fonts/dejavu/DejaVuSans.ttf", 20)
>>> d1.text( (100, 40), t, fill=255, font=f)
>>> i.save("/tmp/dummy.png", optimize=1)

производит:

the example text rendered as white on black

РЕДАКТИРОВАТЬ: я должен сказать, что использование шрифта Deja Vu Sans не было случайным; хотя мне это не очень нравится (и все же я нахожу его глифы лучше, чем Arial), оно читаемо, оно расширило охват Unicode и, похоже, работает лучше со многими приложениями не-MS, чем Arial Unicode MS.

0 голосов
/ 15 июня 2009

Мне кажется, что дело довольно простое. Вы можете использовать шрифты True Type и использовать

Вот пример: Истинные шрифты типа для PIL

Здесь вы можете найти шрифты Hebrew True Type: шрифты ивритского шрифта

Удачи или как мы говорим на иврите - Мазаль Тов.

...