ImageFont的getsize()无法获得正确的文本大小?

2024-09-28 22:10:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用以下两种方法为.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方法:

^{pr2}$

这两种方法在大多数情况下都可以创建正确的预览图像,但在某些情况下(<;2%)会字体.getsize(文本)只是无法获得正确的文本大小,从而导致文本溢出提供的画布。ImageMagick也有同样的问题。在

示例字体和预览:

HANFORD.TTFhttp://download.appfile.com/HANFORD.png

NEWTOW.TTFhttp://download.appfile.com/NEWTOW.png

MILF.TTFhttp://download.appfile.com/MILF.png

SWANSE.TTFhttp://download.appfile.com/SWANSE.png

我查阅了ImageMagick的文档,在http://www.imagemagick.org/Usage/text/#overflow找到了这个问题的解释。在

是否有可能检测到这样的文本溢出并按照我们的预期绘制文本以适合画布?在


Tags: 方法text图像文本comhttppngdownload
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并不能很好地绘制外来字体,无论您指定什么样的字体大小来加载字体,它总是在输出图像之外溢出文本。在

alt text

不是一个编程解决方案,但是当我重新生成你的问题时,它只会发生在你的字体上(其他字体,比如Arial根本没有问题),所以我已经修复了你的字体文件(通过更改ascent/decent度量)。你可以下载here

很抱歉,汉福德的字体不太完美,高度看起来还可以,但是左边的字体不太合适,这超出了我的理解。在

更新:关于Hanford字体,这里有一个解决方法,在文本中传递额外的空格,比如“Handford Script”,然后在图像中裁剪多余的空格,如img=img.crop(img.getbbox())

alt text http://img64.imageshack.us/img64/1903/hanfordfontworkaround.jpg

更新2:我必须将color=(255255255)传入图像。新的获取白底黑字

img = Image.new('RGBA', (text_width, text_height),color=(255,255,255))

alt text

我曾经在PHP和ImageMagick中遇到过类似的问题。在

最后,我解决了这个问题:在一个非常大的画布上绘制文本,然后使用trim/auto-crop函数来修剪文本,这些函数可以从图像中去除额外的空间。在

如果我对你的预览功能理解正确,它实际上已经做到了:只需删除宽度和高度设置就足够了。在

相关问题 更多 >