2015-10-02 4 views
3

Мне нужно рассчитать длину при визуализации большого количества строк, используя специальный шрифт. Из сценария оболочки и ImageMagick я могу что-то сделать, используя параметр командной строки аннотата.Извлечь текстовую строку в изображение для вычисления длины с помощью Wand/ImagaMagick Python

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

И после этого прочитайте ширину рендеринга изображения.

Im изо всех сил пытается понять, как это сделать с помощью 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

Отлично, это именно то, чем я был. Я не понял трюк с filename = 'wizard:'! –

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

Всегда хороший ответ Марк. Вы можете добавить '-формат% w + ident' в первый пример, если вы хотите исключить шаг' ident', и сохранить вывод изображения – emcconville

+0

@emcconville True - хорошее мышление. Я добавлю его после обеда немного. Спасибо. –

+0

Я мог бы сказать, что, может быть, лучший способ. Я бы предпочел решение python с использованием привязок, потому что это должно быть динамически рассчитано на основе ввода пользователем на более позднем этапе. Спасибо за предложение, я все равно попробую ваше предложение. –