Как я могу напечатать хинди предложения (Unicode) на изображении в Python?

У меня есть файл с именем "hindi.txt". Он имеет следующее содержание. Я использую Python3.5.

कामकाजी महिलाओं के लिए देश में दिल्ली असुरक्षित, सिक्किम सबसे बेहतर: रिपोर्ट
9 साल से अटकी राफेल डील मंजूर, 59000 Cr में भारत खरीदेगा 36 फाइटर प्लेन
WhatsApp को टक्कर देने आर्टिफिशियल इंटेलिजेंस के साथ आया गूगल का Allo मैसेंजर
उड़ी हमले पर 10 खुलासे: आर्मी बेस में 150 मीटर अंदर तक घुस आए थे जैश के आतंकी
उड़ी हमलाः भारत का कड़ा रुख देखकर PAK ने LoC से सटे शहरों में कैंसल 
PAK को आतंकी देश करार देने के लिए अमेरिकी संसद में पेश हुआ बिल

Я открываю этот файл и затем читаю построчно. Затем распечатать этот текст в изображении. Мой фрагмент кода показан ниже.

from PIL import Image, ImageDraw, ImageFont, ImageOps
import os

with open("hindi.txt", "r") as filestream:
    cnum = 1
    astr = filestream.read().splitlines()

    font5 = ImageFont.truetype('/home/SunehraBharat/filestotweet/fonts/ARIALUNI.TTF', 26)

    MAX_W, MAX_H = 1500, 1500


    foreground_image = Image.new('RGB', (MAX_W, MAX_H), (0, 0, 0, 0))
    draw = ImageDraw.Draw(foreground_image)
    image_name = str(cnum) + "_" + "image.png"

    current_h, pad = 40, 14
    c = 1
    for txtline in astr:
        line = str(c) + ").  " + txtline
        #printing on console to check if lines are coming correctly.
        print(line)
        w, h = draw.textsize(line, font=font5)
        draw.text((10, current_h), line, font=font5, fill=(255,255,255,1))
        current_h += h + pad
        c = c + 1


    #saving image
    foreground_image.save(image_name)
    cnum = cnum + 1

Вывод на консоль из-за оператора print (line) - правильно

कामकाजी महिलाओं के लिए देश में दिल्ली असुरक्षित, सिक्किम सबसे बेहतर: रिपोर्ट
9 साल से अटकी राफेल डील मंजूर, 59000 Cr में भारत खरीदेगा 36 फाइटर प्लेन
WhatsApp को टक्कर देने आर्टिफिशियल इंटेलिजेंस के साथ आया गूगल का Allo मैसेंजर
उड़ी हमले पर 10 खुलासे: आर्मी बेस में 150 मीटर अंदर तक घुस आए थे जैश के आतंकी
उड़ी हमलाः भारत का कड़ा रुख देखकर PAK ने LoC से सटे शहरों में कैंसल 
PAK को आतंकी देश करार देने के लिए अमेरिकी संसद में पेश हुआ बिल

Теперь мой вывод изображения:

введите описание изображения здесь Как вы можете сравнить сейчас, вывод не относится к вводу. Несколько слов неверны "सिक्किम", "महिलाओं".

Я пробовал разные шрифты. Но получаю один и тот же результат каждый раз. Не могли бы вы мне помочь. И дай мне знать, где мне не хватает.

4 ответа

Кажется, есть открытая ошибка для рендеринга текста хинди (шрифт деванагари).

https://github.com/python-pillow/Pillow/issues/3191

Вы можете попробовать другую библиотеку, такую ​​как: pyvips (я не нахожу API очень интуитивно понятным, но он может работать для вас)

import pyvips


# To install 'pyvips' refers to https://pypi.org/project/pyvips/
#  1. Intall libvips shared library from https://jcupitt.github.io/libvips/install.html
#  2. Set the PATH variable.
#  3. run pip install pyvips

def generate_tweet_image():
    cnum = 1
    output_file = "tweet_file.png"
    text = u''
    with open("hindi.txt", "r", encoding='UTF-8') as filestream:
        for l in filestream.readlines():
            text = text + f'{cnum}) {l}'
            cnum += 1

    MAX_W, MAX_H = 1500, 1500

    # See for API https://jcupitt.github.io/pyvips/vimage.html#pyvips.Image.text

    # font file: ARIALUNI.TTF
    image = pyvips.Image.text(text, width=MAX_W, height=MAX_H, font='Arial Unicode MS', dpi=96)
    image.write_to_file(output_file)
    print(f'File Written at : {output_file}')


generate_tweet_image()

Выход:

Надеюсь это поможет.

Pillow 7.0.0 обеспечивает поддержку рендеринга сложных шрифтов с помощью библиотеки raqm.

Чтобы проверить поддержку:

>>> from PIL import features
>>> print(features.check("raqm"))
True

Если возвращается False, проверьте, установлена ​​ли библиотека:

 /sbin/ldconfig -p | grep raqm
    libraqm.so.0 (libc6,x86-64) => /usr/lib/libraqm.so.0
    libraqm.so (libc6,x86-64) => /usr/lib/libraqm.so

Чтобы установить raqm в дистрибутивы на основе debian:sudo apt-get install libraqm-dev

Чтобы использовать raqm в качестве механизма компоновки, добавьте параметр layout_engine при инициализации шрифта:

font = ImageFont.truetype("foo.ttf", size=90, layout_engine=ImageFont.LAYOUT_RAQM)

Приведенный выше код протестирован на шрифты хинди, маратхи, гуджрати и телугу.

Установка Raqm скоро станет окончательной очисткой, проверьте следующие шаги

Для построения Raqm можно использовать один из следующих методов:

  1. Raqm зависит от следующих библиотек:

FreeType HarfBuzz FriBiDi

Чтобы установить зависимости в Fedora:

sudo dnf install freetype-devel harfbuzz-devel fribidi-devel gtk-doc

Чтобы установить зависимости в Ubuntu:

sudo apt-get install libfreetype6-dev libharfbuzz-dev libfribidi-dev \ gtk-doc-tools

В Mac OS X вы можете использовать Homebrew:

`export XML_CATALOG_FILES="/usr/local/etc/xml/catalog" # for the docs`

Когда у вас есть исходный код и зависимости, вы можете приступить к сборке. Для этого запустите обычную последовательность команд в каталоге исходного кода:

Для этого запустите обычную последовательность команд в каталоге исходного кода (файл конфигурации не найден в пакете, ключ должен был запустить autogen.sh раньше):

$ ./autogen.sh
$ ./configure
$ make
$ make install

Чтобы запустить тесты:

$ make check

sudo ldconfig This step was needed!

Выполните следующий тестовый сценарий: (Убедитесь, что шрифты установлены sudo apt install fonts-indic)


from PIL import Image, ImageFont, ImageDraw

im = Image.new("RGB",(160, 160))
draw = ImageDraw.Draw(im)

font_telugu = ImageFont.truetype("/usr/share/fonts/truetype/fonts-telu-extra/Pothana2000.ttf",50)
text_telugu = "నిత్య"

font_hindi = ImageFont.truetype("/usr/share/fonts/truetype/Gargi/Gargi.ttf",50)
text_hindi = "नित्य"

draw.text((10, 10), text_telugu, font=font_telugu)
draw.text((10, 90), text_hindi, font=font_hindi)
im.show()

  1. установить tar-файл из выпусков Если вы скачали tar-архив с выпусками, запускать./autogen.sh вообще, просто выполните шаги ./configure прямо.

  2. для ubuntu >=18.04 вы можете установить пакет напрямую. Требования для libraqm:

libc6   >= 2.14
libfreetype6    >= 2.4.2
libfribidi0 >= 1.0.0
libharfbuzz0b   >= 2.1.1

Установите пакет raqm Обновите индекс пакета:

    sudo apt-get update

Установите пакет deb libraqm0:

sudo apt-get install libraqm0

Вы можете протестировать свою установку:

from PIL import features
print(features.check("raqm"))
# you should get True now

Эй, я использовал pyvips для написания текста на хинди / деванагари на изображении с помощью python.

Прежде всего, я установил pyvips, но при импорте он выдаст ошибку, поэтому, чтобы решить эту проблему, вам нужно загрузить файл из pyvips и поместить его в путь переменной среды, а затем вы можете поместить текст на изображение.

На самом деле я написал статью, которая содержит пошаговое решение... Я уверен, что это поможет вам.

https://www.infinitycodex.in/how-to-put-hindi-text-on-images-using

Другие вопросы по тегам