簡體   English   中英

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

[英]How can I print Hindi sentences(unicode) on image in 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

Output 在控制台上由於 print(line) 語句 - 正確

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

現在我的圖像 Output:

在此處輸入圖像描述 正如您現在可以比較的那樣,output 與輸入無關。 少數單詞是不正確的“सिक्किम”,“महिलाओं”。

我試過不同的 fonts。但每次都得到相同的結果。 你能幫我么。 讓我知道我失蹤的地方。

呈現印地文(梵文字體)文本似乎存在一個未解決的錯誤。

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

在基於 debian 的發行版中安裝 raqm: 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 文件 如果您下載了發行版 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

嘿,我曾使用 pyvips 在圖像上使用 python 編寫印地文/梵文文本。

首先我安裝了 pyvips,但是當你導入它時它會給你一個錯誤,所以為了解決這個問題你必須從 pyvips 下載文件並將它放在你的環境變量路徑中然后你可以將文本放在圖像上。

實際上,我寫了一篇包含逐步解決方案的文章......我相信這會對你有所幫助。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM