2009-12-27 24 views
5

我使用下面的兩種方法來生成文本預覽圖像獲得.TTF字體文件ImageFont的getsize()沒有得到正確的文本大小?

PIL方法:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    try: 
     font = ImageFont.truetype(fontfile, fontsize) 
     text_width, text_height = font.getsize(text) 
     img = Image.new('RGBA', (text_width, text_height)) 
     draw = ImageDraw.Draw(img) 
     draw.text((0, 0), text, font=font, fill=(0, 0, 0)) 
     return True 
    except: 
     return False 

ImageMagick的方法:

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.Popen(['convert', '-font', fontfile, '-background', 
      'transparent', '-gravity', 'center', '-pointsize', str(fontsize), 
      '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

這兩種方法大部分時間創建正確的預覽圖像,但在極少數情況下(< 2%),font.getsize(文本)只是cann ot得到正確的文本大小導致文本溢出提供畫布。 ImageMagick也有同樣的問題。

樣的字體和預覽:

HANFORD.TTF http://download.appfile.com/HANFORD.png

NEWTOW.TTF http://download.appfile.com/NEWTOW.png

MILF.TTF http://download.appfile.com/MILF.png

SWANSE.TTF http://download.appfile.com/SWANSE.png

我看了一下ImageMagick的文檔,發現這個問題的解釋在http://www.imagemagick.org/Usage/text/#overflow

是否有可能檢測到這種文本溢出並按照我們的預期繪製文本以適應畫布?

回答

1

在這種情況下,只需指定ImageMagick以使用固定字體大小的較大畫布大小,它將在保持其完整性的同時在指定的點大小處繪製文本。

def make_preview(text, fontfile, imagefile, fontsize=30): 
    p = subprocess.call(['convert', '-font', fontfile, '-background', 
     'transparent', '-gravity', 'center', '-size', '1500x300', 
     '-pointsize', str(fontsize), '-trim', '+repage', 'label:%s' % text, image_file]) 
    return p==0 

如果您需要文本符合指定的畫布,而不是使用一個固定點的大小,你可能需要它的創建後,調整輸出圖像。

PIL不會很好地繪製奇特的字體,無論您指定何種字體大小來載入字體,它總是會在輸出圖像之外溢出文本。

2

我在PHP和ImageMagick中遇到了類似的問題。

最後,我解決了這個問題,在一個非常大的畫布上繪製文本,然後使用trim/auto-crop函數修剪它,從而爲圖像留下額外的空間。

如果我理解你的預覽功能,它實際上已經做到了這一點:只需刪除寬度和高度設置就足夠了。

+0

@Pekka,你的方法可以通過IM的作品,但它會造成很大的開銷,不僅修整,而且調整裁剪圖像以適合指定的畫布尺寸。這不適用於PIL。它總是繪製上面的字體的上半部分,即使我創建一個更大的畫布。 – jack 2009-12-29 02:40:24

+0

嘗試在* trim和repage命令之前放置「label」命令,它應該可以工作。開銷,我忍不住。 – 2009-12-29 08:48:27

5

alt text http://img9.imageshack.us/img9/2419/fontfix.jpg

不是編程解決方案,但是當我重新您的問題,它只是發生在你的字體(其他字體如Arial是一點問題都沒有),所以我有固定的字體文件(通過改變上升/體面指標)。你可以下載here

對於漢福德腳本字體,它不完美,因爲你看,高度似乎沒問題,但左側沒有被繪製,它出於我的理解。

UPDATE:關於漢福德字體,這裏是一個變通,通過額外的空間在文本像「Handford腳本」,然後裁剪圖像的額外空間像img=img.crop(img.getbbox())

alt text http://img64.imageshack.us/img64/1903/hanfordfontworkaround.jpg

UPDATE2:我必須通過Image.New中的顏色=(255,255,255)才能在白色背景上獲得黑色文本

img = Image.new('RGBA', (text_width, text_height),color=(255,255,255)) 

alt text http://img245.imageshack.us/img245/3462/colorblackh.jpg

+0

如何修改指定字體的上升/下降指標?每種字體都需要手動重新調整嗎? – jack 2010-01-05 06:44:06

+0

我用fontforge來編輯這些字體,插孔。 – YOU 2010-01-05 06:47:05

+0

由於版權問題,我認爲最好將字體保持原樣並在較大的畫布上繪製文本,然後剪裁。但是你的方法只能用於個人用途。謝謝你的建議。 – jack 2010-01-05 14:58:54