2015-07-01 51 views
2

我使用Python PIL(我使用枕頭)在背景圖像上呈現用戶輸入文本。如何使用PIL(枕頭)來繪製任何語言的文字?

的代碼很簡單:

draw = ImageDraw.Draw(im) 
draw.text((x, y), text, font=font, fill=font_color) 

的問題是,用戶可以在任何語言輸入,我怎麼能確定使用哪個font

ps:我知道我必須先有字體文件,所以我搜索並找到了Google Noto,下載了所有的字體,把它們放在/usr/local/share/fonts/中,但是這些字體是用語言分隔的,所以我仍然無法加載字體可以呈現所有用戶輸入文字。

+1

[此問題](https://github.com/googlei18n/noto-fonts/issues/13)在noto-fonts github頁面上調出 。單個ttf僅限於〜64K字形。 Unicode 8.0擁有超過100K字形。所以一個ttf不能包含所有的unicode字形 – unutbu

回答

3

NoTo(字面上只是Adobe的Source Pro字體名稱不同,因爲Google更容易以這種方式銷售)不是單個字體,而是一個字體系列。當你go to download them,谷歌明確地告訴你,現在有很多不同的版本很多不同的目標語言,爲兩個簡單的原因:

  1. 如果需要排版整個星球的組已知的腳本,有遠遠超過單個字體的字形(OpenType字體由於字形ID被編碼爲USHORT字段而每個文件具有65535個字形的硬限制,並且字體是組成的:「字母」實際上可以是字母C和符號°,所以它依靠三個字形:兩個真正的字形和一個虛擬的構圖,這樣就會很快用完空間)和
  2. 即使一種字體可以適合所有的字形,相同的腳本可能需要根據其使用的語言而呈現相當不同的字體,所以即使對於中文和日文,或阿拉伯文和烏爾都語都使用單字體,沒有工作。雖然OpenType字體可以通過被告知要使用哪種變體集以及基於特定語言標記的哪些組合規則來應對,這是在InDesign或LaTeX中非常有效的控制類型,並且是正在進行的字體最糟糕的事情用於無控制的上下文中(比如像Android的webview)。

因此,妥善解決是抓住所有的字體,然後挑基礎上,{script, language}對你產生的文本是正確的。這比你想要做的更復雜嗎?是。有必要嗎?同樣是=)

相關問題