如何在Python中打印图像上的印地语句子(unicode)?

时间:2016-09-22 05:28:35

标签: python unicode python-imaging-library pillow hindi

我有一个名为“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 正如您现在可以比较的那样,输出与输入无关。几句话不正确“सिक्किम”,“महिलाओं”。

我尝试过不同的字体。但每次都得到相同的结果。 你能帮我么。让我知道我失踪的地方。

3 个答案:

答案 0 :(得分:13)

似乎存在一个渲染印地文(Devanagari字体)文本的错误。

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

输出:

enter image description here

希望这会有所帮助。

答案 1 :(得分:2)

枕头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 :(得分:0)

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

    releases
  1. 安装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

安装libraqm0 deb软件包:

sudo apt-get install libraqm0

您可以通过以下方式测试安装:

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