getsize ImageFont () не получает размер правильного текста?

Я использую следующие два метода для генерировать текстовое изображение предварительного просмотра для .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.

Действительно ли возможно обнаружить такое текстовое переполнение и нарисовать текст для установки холсту, как мы ожидали?

5
задан jack 27 December 2009 в 07:51
поделиться

3 ответа

В этом случае достаточно указать 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 не очень хорошо рисует экзотические шрифты, независимо от того, какой размер точки вы указываете для загрузки шрифта, он всегда переполняет текст за пределами выходного изображения.

1
ответ дан 14 December 2019 в 04:39
поделиться

Однажды у меня была похожая проблема в PHP и ImageMagick.

В конце концов, я решил эту проблему, нарисовав текст на очень большом холсте, а затем обрезая его с помощью функций trim/auto-crop, которые сбрасывают лишнее пространство с изображения.

Если я правильно понимаю вашу функцию предварительного просмотра, то на самом деле она уже делает именно это: Этого должно быть достаточно, чтобы просто удалить настройки ширины и высоты.

2
ответ дан 14 December 2019 в 04:39
поделиться

alt text

Не программное решение, но когда я регенерирую вашу проблему, это происходит только с вашими шрифтами (другие шрифты, такие как 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))

alt text

5
ответ дан 14 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: