2015-10-02 46 views
3

我需要計算使用自定義字體渲染大量字符串時的長度。從shell腳本和ImageMagick中,我可以使用annotate命令行選項做些事情。將文本字符串渲染爲圖像以使用魔杖/ ImagaMagick Python計算長度

convert -debug annotate xc: -font "customfont.ttf" -pointsize "25" -annotate 0 "this is the text" out.png 

然後讀取渲染圖像的寬度。

我正在努力瞭解如何用python'Wand'lib做到這一點。我創建了一個字體對象,但我似乎需要定義畫布的寬度來繪製字體。

任何建議表示讚賞。

回答

3

你會使用wand.drawing.Drawing.get_font_metrics這將返回一個FontMetrics類的實例。

from wand.image import Image 
from wand.drawing import Drawing 

with Image(filename='wizard:') as img: 
    with Drawing() as context: 
     context.font_family = 'monospace' 
     context.font_size = 25 
     metrics = context.get_font_metrics(img, 
              "How BIG am I?", 
              multiline=False) 
     print(metrics) 

#=> FontMetrics(character_width=25.0, 
#    character_height=25.0, 
#    ascender=23.0, 
#    descender=-5.0, 
#    text_width=170.0, 
#    text_height=29.0, 
#    maximum_horizontal_advance=50.0, 
#    x1=0.0, 
#    y1=0.0, 
#    x2=19.21875, 
#    y2=18.0, 
#    x=170.0, 
#    y=0.0) 
+0

謝謝,我會稍後再試。 –

+0

非常好,這正是我之後的事情。我沒有意識到文件名='嚮導'的訣竅:'! –

2

您可以使用label:並讓ImageMagick計算您需要的寬度嗎?

convert -font "Arial" -pointsize 64 label:"this is the text" out.png 
identify out.png 
out.png PNG 396x73 396x73+0+0 8-bit sRGB 256c 2.57KB 0.000u 0:00.000 

,或者更簡單地說:

convert -font "Arial" -pointsize 64 label:"this is the text" -format %w info: 
396 

,或者埃裏克建議:

convert -font "Arial" -pointsize 64 label:"this is the text" -format %w +identify result.png 
396 

或者,如果你想使用annotate,你可以做一個更大的畫布和修剪,像這樣:

convert -gravity west xc:white[1000x1000] -font "arial" -pointsize 32 -annotate 0 "this is the text" -trim -format %w info: 
197 
+1

始終是一個很好的答案馬克。如果你想消除'identify'步驟,並且保持輸出圖像 – emcconville

+0

@emcconville True - 好的想法,你可以在第一個例子中加上'-format%w + identify'。午餐後我會添加一點....謝謝。 –

+0

我可以肯定這也許是更好的方法。我更喜歡使用綁定的python解決方案,因爲這需要根據用戶在後期的輸入動態計算。感謝您的建議,我絕不會少嘗試您的建議。 –