我使用下面的兩種方法來生成文本預覽圖像獲得.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。
是否有可能檢測到這種文本溢出並按照我們的預期繪製文本以適應畫布?
@Pekka,你的方法可以通過IM的作品,但它會造成很大的開銷,不僅修整,而且調整裁剪圖像以適合指定的畫布尺寸。這不適用於PIL。它總是繪製上面的字體的上半部分,即使我創建一個更大的畫布。 – jack 2009-12-29 02:40:24
嘗試在* trim和repage命令之前放置「label」命令,它應該可以工作。開銷,我忍不住。 – 2009-12-29 08:48:27