如何在Python中将印度语句(Unicode)打印到图像上?

19

我有一个名为"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 को आतंकी देश करार देने के लिए अमेरिकी संसद में पेश हुआ बिल

现在我的图像输出:

enter image description here 如您所见,输出结果与输入不符合。一些词语不正确,比如“सिक्किम”、“महिलाओं”。

我已经尝试了不同的字体,但每次都得到相同的结果。 请问您能否帮忙解决问题并告知我哪里出了差错。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Klaus D.
你对此有什么建议吗?版本是最新的。 - Pooja
1
Pillow的最新版本是:5.2.0。此外,似乎有一个与您的问题相关的未解决问题:https://github.com/python-pillow/Pillow/issues/2255。 - skadya
1
和 https://github.com/python-pillow/Pillow/issues/3191 相关的编程内容。 - skadya
无法与以下三个库一起使用 - pillow - 已报告的问题#2255opencv - 已报告的问题#118,以及unicode_text_to_image_array - 已报告的问题#2 - Pankaj Singhal
显示剩余2条评论
4个回答

15

渲染印地文(天城体字体)文本存在一个开放的错误。

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()

输出:

在此输入图像描述

希望这可以帮到您。


谢谢!这个很有效。我一直在用PIL寻找解决方案,但是无法使其工作。 - Chirag Maheshwari
如果有人想要在文本后面使用透明背景:image = image.ifthenelse([255, 255, 255], [0, 0, 0], blend=True) - Chirag Maheshwari
有没有关于PHP的解决方案? - Adarsh Khatri

3

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

为在基于Debian的发行版中安装raqm,请执行以下操作:sudo apt-get install libraqm-dev 要使用raqm作为布局引擎,在初始化字体时添加layout_engine选项:
font = ImageFont.truetype("foo.ttf", size=90, layout_engine=ImageFont.LAYOUT_RAQM)

上述代码已经测试了印地语、马拉地语、古吉拉特语和泰卢固语字体。

2

安装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文件。如果您已下载发布的tarball,您无需运行./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

安装 libraqm0 deb 包:

sudo apt-get install libraqm0

您可以通过以下方式测试您的安装:
from PIL import features
print(features.check("raqm"))
# you should get True now

对于Windows系统,您可以使用此处显示的libraqm预构建DLL - Gokul NC

0

嘿,我使用pyvips和Python在图像上编写了印地语/天城文本。

首先,我安装了pyvips,但是当你导入它时会出现错误,所以为了解决这个问题,你必须从pyvips下载文件并将其放在环境变量路径中,然后你就可以在图像上放置文本。

实际上,我写了一篇文章,其中包含逐步解决方案...我相信这会对你有所帮助。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接