ImageFont的getsize()没有得到正确的文本大小?

时间:2009-12-27 07:51:31

标签: python fonts imagemagick python-imaging-library

我使用以下两种方法为.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找到了对此问题的解释。

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

3 个答案:

答案 0 :(得分:5)

alt text

不是编程解决方案,但是当我重新生成你的问题时,它只发生在你的字体上(Arial等其他字体完全没问题),所以我修改了你的字体文件(通过改变上升/体面指标)。你可以下载here

抱歉汉福德剧本字体,它看起来并不完美,身高看起来还不错,但是左边没有画出来,这是出于我的理解。

更新:关于Hanford字体,这是一个解决方法,在文本中传递额外的空格,如“Handford Script”,然后裁剪图像中的额外空格,如{ {1}}

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

UPDATE2 :我必须在Image.New中传递color =(255,255,255)才能在白色背景上获取黑色文字

img=img.crop(img.getbbox())

alt text

答案 1 :(得分:2)

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

最后,我通过在非常大的画布上绘制文本,然后使用trim/auto-crop函数修剪它来解决这个问题,这些函数可以减少图像上的额外空间。

如果我理解你的预览功能,它实际上已经完全正确:只需删除宽度和高度设置即可。

答案 2 :(得分:1)

在这种情况下,只需指定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不能很好地绘制异域字体,无论你指定加载字体的点大小,它总是溢出输出图像外的文本。