Способы создания превью текста из шрифта

В настоящее время я использую команду ImageMagick convert для создания предварительного просмотра текста (.png) из файла шрифта .ttf. В целом, это лучше при автоматическом позиционировании текста, несмотря на то, что иногда ему не удавалось прочитать какой-нибудь действительный файл .ttf. Скорость небольшая, но приемлемая.

ImageFont PIL выглядит не очень хорошо для выравнивания текста, часто печатает нижний левый угол первого символа за пределами холста.

Кто-нибудь знает лучший выбор, кроме двух вышеупомянутых? Интересно, какие технологии необходимы для поддержки части предварительного просмотра текста на таких сайтах, как myfonts.com, с таким большим трафиком.

ИЗМЕНИТЬ

Пример шрифта PIL не может правильно рисовать шрифты. В примере используется шрифт скрипт Хэнфорда.

import Image, ImageDraw, ImageFont
font = ImageFont.truetype('HANFORD_.TTF', 122)
text_width, text_height = font.getsize('Hanford script')
print text_width, text_height
>>> 833 47
img = Image.new('RGBA', (text_width, text_height))
draw = ImageDraw.Draw(img)
draw.text((0, 0), 'Hanford script', font=font, fill=(0, 0, 0))
img.save('output.png')

Выходное изображение содержит только верхнюю половину «сценария Хэнфорда».

Я пробовал использовать команду convert imagemagick:

convert -font "HANFORD_.TTF" -background transparent -gravity center -size 830x80 label:'Hanford script' output.png

Выходное изображение было таким же, как и у меня с помощью PIL.

Это не единственный шрифт, для которого PIL или imagemagick не могут получить правильный размер текста. С некоторыми другими шрифтами, такими как Ginga, они просто увеличивают высоту текста, что приводит к верхней половине выходных изображений пустые. Кто-нибудь знает причину?


person jack    schedule 17.12.2009    source источник
comment
Добавление образца кода с ImageFont, демонстрирующего возникшую у вас проблему, может помочь кому-то показать, как ее избежать. Я ожидал, что PIL может предоставить полностью адекватное решение, если все сделано правильно.   -  person Peter Hansen    schedule 17.12.2009
comment
@Peter, я добавил несколько примеров. Благодарность   -  person jack    schedule 22.12.2009
comment
К сожалению, главный вопрос остается без ответа. Одна из причин, по которой PIL и другое программное обеспечение может неправильно рассчитать высоту текста, заключается в том, что автор шрифта неправильно определил для него значения верхнего и нижнего нижних элементов. PIL выполняет этот расчет с помощью библиотеки FreeType, поэтому, если шрифт неправильный, окончательный результат определенно неверен. Теперь бывают ситуации, когда шрифт правильный, но, тем не менее, PIL неправильно рассчитывает. С этим шрифтом HANFORD_.TTF неправильно вычисляется PIL, патч на stackoverflow.com/questions/13821882/pil- обрезанные буквы решают проблему.   -  person mmgp    schedule 15.12.2012


Ответы (3)


Я полагаю, что такие сайты управляются небольшим пользовательским кодом, использующим что-то вроде Pango или просто Freetype на задней панели для рендеринга в файлы изображений.

Возможно, изображения даже никогда не попадут на диск, хотя я уверен, что все кэшируется там, где это необходимо.

person James    schedule 19.12.2009

Это своего рода нестандартное решение, но вы смотрели на sIFR (Scalable Inman Flash Replacement)? Он используется, чтобы позволить веб-дизайнерам вставлять короткие фрагменты текста (заголовки и т. Д.) С текстом, отображаемым любым шрифтом, который они выбирают для использования, даже если пользователь не установил его локально.

Если бы вы создали простую веб-страницу с помощью sIFR и обслуживали ее локально для себя, это могло бы соответствовать вашим целям.

Как я уже сказал, это своего рода неприятное решение, но ... :-)

person Peter Rowell    schedule 19.12.2009

У меня тоже была такая же проблема. Несколько дней назад я обнаружил эту библиотеку. Я попробовал, и это показалось мне действительно полезным. Делюсь ссылкой, так как у меня тоже была такая же проблема.

https://github.com/MatteoGuadrini/fontpreview

Пример предварительного просмотра шрифта:

from fontpreview import FontPreview

fp = FontPreview('/tmp/noto.ttf')
fp.save('/tmp/fp.png')
person lafihay530    schedule 26.11.2020