Инструменты для создания текста в виде растровых изображений (сглаженный текст, произвольный интервал, прозрачный фон) - PullRequest
4 голосов
/ 21 января 2009

Мне нужно создать пакетное изображение с текстом. Требования:

  1. произвольный размер растрового изображения
  2. PNG формат
  3. прозрачный фон
  4. черный текст, сглаженный против прозрачности
  5. регулируемое расстояние между символами
  6. регулируемая позиция текста (координаты x и y, где начинается текст)
  7. Поддержка TrueType и / или Type1
  8. Инструмент командной строки Unix или библиотека Python

Пока что я оценил следующее:

Проблема с PIL заключается в том, что, например, интервал по умолчанию для Verdana слишком мал. Мне нужно, чтобы текст был немного плотнее, но в PIL его невозможно отрегулировать.

В ImageMagick я не нашел простого способа указать, где на изображении начинается текст (я использую -size WIDTHxHEIGHT и заголовок: 'TEXT'). Добавление прозрачной рамки отодвинет текст от угла, к которому он подключен, но

  • Размер изображения должен быть соответствующим образом скорректирован, поскольку граница добавляет экстентам
  • невозможно настроить горизонтальное и вертикальное смещение независимо

Я пропустил некоторые очевидные альтернативы или не смог найти необходимые функции из вышеупомянутого?

Ответы [ 3 ]

4 голосов
/ 21 января 2009

(5) действительно выглядит сложно, если не считать вставки фиктивных узких мест в строку (что нарушит кернинг) или использования чего-то гораздо более высокого уровня, например, рендеринга SVG или HTML / CSS.

Однако, если вы не возражаете запачкать руки, довольно легко взломать рендерер freetype PIL и добавить горизонтальное пространство. См. _imagingft.c ; после следующего кода в font_getsize и font_render:

if (kerning && last_index && index) {
    FT_Vector delta;
    FT_Get_Kerning(self->face, last_index, index, ft_kerning_default,
                   &delta);
    x += delta.x >> 6;
}

Добавить:

if (last_index && index) {
    x += tracking;
}

Попробуйте сначала с простым целым числом для отслеживания (вероятно, довольно большим, судя по тому, что '>> 6'); скомпилируйте и посмотрите, работает ли он. Следующим шагом будет получение значения отслеживания в функцию C из Python, для чего вам придется изменить вызов ParseTuple в font_render на:

long tracking;
if (!PyArg_ParseTuple(args, "Ol|il:render", &string, &id, &mask, &tracking))
    return NULL;

И в font_getsize:

long tracking;
if (!PyArg_ParseTuple(args, "O|l:getsize", &string, &tracking))
    return NULL;

Тогда посмотрите, какой интерфейс Python вам нужен. Это тривиальный, но довольно утомительный случай добавления дополнительного аргумента 'tracking' через каждый уровень интерфейса, например:

def truetype(filename, size, index=0, encoding="", tracking= 0): # added optional tracking
    "Load a truetype font file."
    try:
        return FreeTypeFont(filename, size, index, encoding, tracking) # added tracking
    ...

class FreeTypeFont:
    "FreeType font wrapper (requires _imagingft service)"

    def __init__(self, file, size, index=0, encoding="", tracking= 0): # added tracking
        import _imagingft
        self.font = _imagingft.getfont(file, size, index, encoding)
        self.tracking= tracking # add this line

    ...

    def getmask2(self, text, mode="", fill=Image.core.fill):
        size, offset = self.font.getsize(text, self.tracking) # use tracking
        im = fill("L", size, 0)
        self.font.render(text, im.id, mode=="1", self.tracking) # use tracking
        return im, offset

Я не проверял ничего из этого! Если это работает, возможно, стоит отправить его как патч.

3 голосов
/ 21 января 2009

Вот решение SVG + ImageMagick:

Программно создавать документы SVG на основе этого шаблона, заменяя «ТЕКСТ ЗДЕСЬ» на желаемое текстовое содержимое:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE svg PUBLIC
      "-//W3C//DTD SVG 1.0//EN"
      "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" width="152px" height="50px">
  <text style="font-size: 22px; font-weight:bold; font-family: Verdana-Bold;
               letter-spacing: -1.3%;">
    <tspan x="10" y="39">TEXT HERE</tspan>
  </text>
</svg>

Преобразование документов в PNG с прозрачным фоном с помощью ImageMagick's convert:

$ convert -background none input.svg output.png
2 голосов
/ 21 января 2009

На первый взгляд Pango поддерживает межбуквенный интервал . Pango имеет привязки Python и интегрирован с Cairo.

...