LINUX.ORG.RU

python-cairo: Какое move_to() выбрать для текста?


0

1

Размер текстовой строки на «холсте» (в пикселях) определяю через ctx.text_extents(s_text)[2:4]. Но тупая печать: ctx.move_to(0,H) - не проходит - текст вылазит за границы «холста». В чём ошибка? Как исправить? Для отладочных целей я увеличил холст (см. +16, +16).

#!/usr/bin/python

import cairo
import sys

argc = len(sys.argv)
if (argc < 4): sys.exit()
font_face = sys.argv[1]
filename_o = sys.argv[2]
s_text = sys.argv[3]
size = int(sys.argv[4])

W = 0
H = 0
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, W, H)
ctx = cairo.Context(surface)
ctx.select_font_face(font_face)
ctx.set_font_size(size)
w, h = ctx.text_extents(s_text)[2:4]
W = int(w)
H = int(h)
print w,h

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, W+16, H+16)
ctx = cairo.Context(surface)
ctx.select_font_face(font_face)
ctx.set_font_size(size)
ctx.move_to(0,H)
ctx.text_path(s_text)
ctx.fill()

surface.write_to_png(filename_o)
./pycrtext "Libertine" output.png "abcdefghijklmnopqrtsuvwxyz" 32

★★★★★

В принципе, такое можно сделать и с помощью ImageMagick:

convert -pointsize 24 -font LinLibertine_Re-4.7.5.ttf label:abcdef example.gif
Но, хотелось бы, чтобы заработало и через Cairo.

pacify ★★★★★
() автор топика

Ты не учитываешь метрики шрифта.

fascent, fdescent, fheight, fxadvance, fyadvance = cr.font_extents()
xbearing, ybearing, width, height, xadvance, yadvance = (cr.text_extents(label))
cr.move_to(w / 2.0 - xbearing - width / 2, h / 2.0 - fdescent + fheight / 2)

Этот сниппет центрирует текст на холсте с размером w x h.

baverman ★★★
()
Ответ на: комментарий от baverman

Спасибо за чёткий ответ.
Правда, в терминологии (xbearing, fdescent) пока ничего не понимаю. Но, думаю, разберусь.

pacify ★★★★★
() автор топика
Ответ на: комментарий от baverman

А для холста такие размеры подойдут?

W = int(width)
H = int(fheight)
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, W, H)
По ширине, вроде, подходит. Вот с высотой - не уверен. Высоты fheight - заведомо хватит для любого знака из шрифта? Оно (значение) даже, ИМХО, великовато.

(пояснение в Tutorial, действительно, сжатое - я там не уяснил геометрии; надо будет чертить, и - пробовать понимать, что - откуда меряется)

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

А для холста такие размеры подойдут?

Да.

Оно (значение) даже, ИМХО, великовато.

Резерв для глифов, с хвостами, ниже основного уровня.

baverman ★★★
()
Ответ на: комментарий от baverman

Резерв для глифов, с хвостами, ниже основного уровня.


Почему-то вот этот код http://php.kirovnet.ru/pyfont.html :

fascent, fdescent, fheight, fxadvance, fyadvance = ctx.font_extents()
xbearing, ybearing, width, height, xadvance, yadvance = (ctx.text_extents(s_text))
...
W = int(width)
H = int(fheight) # для глифов, с хвостами, ниже основного уровня
...
ctx.move_to(W/2.0 - width/2 - xbearing, H/2.0 + fheight/2 - fdescent)
печатает не все шрифты корректно. Для хвостов снизу места иногда не хватает.
См. http://php.kirovnet.ru/pyfont-yandex.html

(для шрифтов
birch_ctt.ttf - не влазит буква «д»
grunge.ttf (сверху)
PochKUcs.ttf - все шрифты серии «Почаевская»
)

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

Для хвостов снизу места иногда не хватает.

Вполне вероятно, что это просто кривые шрифты с неправильными метриками.

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.