Как я могу напечатать хинди предложения (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 можно использовать один из следующих методов:
- 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()
установить tar-файл из выпусков Если вы скачали tar-архив с выпусками, запускать
./autogen.sh
вообще, просто выполните шаги./configure
прямо.для 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