2012-12-11 40 views
5

我花了很多時間使用Python製作我的第一個Web應用程序,並且我使用來生成圖像。閱讀了很多後,我設法實現了適當的文本對齊,打包,生成具有許多擴展名的文件等。PIL截斷字母的頂部

但是,由PIL生成的所有文本都在頂部被截斷。這是一個示例。

Example of PIL-generated image with text cut off at the top

應該說ŻÓĆjygpq在多種字體(字體名稱左側)。

我在這裏發現了幾個帖子:fonts clipping with PIL, 但我想避免使用另一個模塊(aggdraw);因爲我已經在PIL中發現了很多東西,所以我想堅持下去。

我試過很多不同大小的字體,但文本仍然被截斷。我甚至試圖使用PIL字體,但它仍然不起作用。 [也將OTF轉換爲BDF和PIL]。

這是在Ubuntu上。接下來我應該嘗試什麼?

+0

有趣的問題,如果可以修改而不進入PIL的C部分,我會感到驚訝。 – mmgp

+0

您是否可以包含用於打印這些文本的示例代碼?我修補了_imagingft.c,它似乎適用於我測試的字體。 – mmgp

+0

感謝您的回答。 我簡化它一點點,但該方法是一樣的: ''color_text = '黑' 文本2 = 'DejaVuSans.ttf' font1 = ImageFont.truetype('的/ usr /共享/字體/的TrueType/TTF -dejavu/DejaVuSans.ttf',34) draw.text((20,50),text2,color_text,font = font1)'' 它沒有任何花哨的東西,只是幾個計算包裝,居中等 所以這只是pil提供的基本draw.text。理論上它應該是開箱即用的,特別是那些PIL類型的字體。 – Matt

回答

4

我希望在這個問題上出錯,但唯一正確的解決方法就是修補_imagingft.c 如何呈現文本。 PIL依賴FreeType完成此任務,但PIL似乎錯誤地計算了定位。此外,getsize中的高度被高估(儘管這不會導致問題)。目前,我已經提供了一個補丁來處理這些問題:http://pastebin.com/jP2iLkDN(似乎有更好的方法來修補渲染代碼)。

這裏是輸出I得到無貼片並與補丁,分別的一些例子:使用存在於連接的討論中的代碼

  enter image description here     enter image description here

結果。在OSX:

  enter image description here     enter image description here

在Ubuntu:

  enter image description here     enter image description here

這裏是產生頂部的數字的代碼:

# -*- encoding: utf8 -*- 
import sys 
import Image, ImageDraw, ImageFont 

im = Image.new("RGBA", (1000, 1000), 'white') 
draw = ImageDraw.Draw(im) 

start_y = 7 
text = u'\u00d1\u00d3yŻ\u00d4Ćgp\u010c\u0137' 
for i in xrange(28, 46, 2): 
    font = ImageFont.truetype('Junicode-Bold.ttf', i) 
    width, height = font.getsize(text) 
    draw.rectangle((0, start_y, width, height + start_y), outline='blue') 
    draw.text((0, start_y), text, font=font, fill='black') 
    start_y += height + 7 

im.crop((0, 0, width + 1, start_y + 2)).save(sys.argv[1]) 

底部數字是根據鏈接主題中關於PIL剪切部分文本的代碼生成的。

+0

這個補丁的一個缺點是,當你一次一個字母地寫信而不是整個文本時,它會引起麻煩(垂直對齊問題)。爲了解決這個問題,補丁需要進一步修改PIL,以便返回文本的基線(好處是'getsize'),然後在調用'render'時傳遞該值。函數'getsize'也需要返回垂直方向的正確偏移量,當前總是爲0. – mmgp

+0

您爲我節省了很多時間。謝謝! – lqdc

1

不是最好的解決方案,但我看到人們已經通過在他們的文本中添加前導空格來解決這個問題。

+0

謝謝你的答案,不幸的是它沒有幫助。 – Matt