Я использую следующие два метода для генерировать текстовое изображение предварительного просмотра для .ttf файла шрифтов
Метод PIL:
def make_preview(text, fontfile, imagefile, fontsize=30):
try:
font = ImageFont.truetype(fontfile, fontsize)
text_width, text_height = font.getsize(text)
img = Image.new('RGBA', (text_width, text_height))
draw = ImageDraw.Draw(img)
draw.text((0, 0), text, font=font, fill=(0, 0, 0))
return True
except:
return False
Метод ImageMagick:
def make_preview(text, fontfile, imagefile, fontsize=30):
p = subprocess.Popen(['convert', '-font', fontfile, '-background',
'transparent', '-gravity', 'center', '-pointsize', str(fontsize),
'-trim', '+repage', 'label:%s' % text, image_file])
return p==0
Оба метода создают корректные изображения предварительного просмотра большую часть времени, но в некоторых редких случаях (<2%), font.getsize (текст) просто не может получить размер правильного текста, которые приводят к тексту переполненный обеспеченный холст. ImageMagick имеет ту же проблему.
Демонстрационные шрифты и предварительные просмотры:
HANFORD.TTF http://download.appfile.com/HANFORD.png
NEWTOW.TTF http://download.appfile.com/NEWTOW.png
MILF.TTF http://download.appfile.com/MILF.png
SWANSE.TTF http://download.appfile.com/SWANSE.png
Я изучил документацию ImageMagick и нашел объяснение этой проблемы по http://www.imagemagick.org/Usage/text/#overflow.
Действительно ли возможно обнаружить такое текстовое переполнение и нарисовать текст для установки холсту, как мы ожидали?
В этом случае достаточно указать ImageMagick для использования большего размера холста с фиксированным размером шрифта, и он будет рисовать текст с заданным размером точки, сохраняя при этом целостность.
def make_preview(text, fontfile, imagefile, fontsize=30):
p = subprocess.call(['convert', '-font', fontfile, '-background',
'transparent', '-gravity', 'center', '-size', '1500x300',
'-pointsize', str(fontsize), '-trim', '+repage', 'label:%s' % text, image_file])
return p==0
Если вам нужно подогнать текст под заданный холст, а не использовать фиксированный размер точки, то возможно, вам понадобится изменить размер выходного изображения после его создания.
PIL не очень хорошо рисует экзотические шрифты, независимо от того, какой размер точки вы указываете для загрузки шрифта, он всегда переполняет текст за пределами выходного изображения.
Однажды у меня была похожая проблема в PHP и ImageMagick.
В конце концов, я решил эту проблему, нарисовав текст на очень большом холсте, а затем обрезая его с помощью функций trim/auto-crop, которые сбрасывают лишнее пространство с изображения.
Если я правильно понимаю вашу функцию предварительного просмотра, то на самом деле она уже делает именно это: Этого должно быть достаточно, чтобы просто удалить настройки ширины и высоты.
Не программное решение, но когда я регенерирую вашу проблему, это происходит только с вашими шрифтами (другие шрифты, такие как Arial, вообще не проблема), поэтому я исправил ваши файлы шрифтов (изменив метрики восхода/захода). вы можете скачать здесь,
И извините за шрифт Hanford Script Font, он не идеален, как вы видите, высота кажется нормальной, но левая сторона не нарисована, это в моем понимании.
UPDATE: Что касается Hanford Font, вот работа, передайте дополнительное пространство в тексте, как " Handford Script", а затем обрезайте дополнительное пространство в изображении, как img=img.crop(img.getbbox())
alt text http://img64.imageshack.us/img64/1903/hanfordfontworkaround. jpg
UPDATE2:Мне пришлось передать color=(255,255,255) в Image.New, чтобы получить черный текст на белом фоне
img = Image.new('RGBA', (text_width, text_height),color=(255,255,255))