python - ImageFont 的 getsize() 没有得到正确的文字大小?

标签 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(text) 无法获得正确的文本大小,导致文本溢出提供的 Canvas 。 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 .

是否有可能检测到此类文本溢出并按照我们的预期绘制文本以适合 Canvas ?

最佳答案

alt text

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

抱歉,关于 Hanford Script 字体,它并不像你看到的那样完美,高度似乎还可以,但左侧没有被绘制,这超出了我的理解。

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

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

UPDATE2:我必须在 Image.New 中传递 color=(255,255,255) 才能获得白底黑字

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

alt text

关于python - ImageFont 的 getsize() 没有得到正确的文字大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1965466/

相关文章:

css - imagemagick command-line -shadow like photoshop inner-shadow 问题

c++ - ruby 中使用 C++ .so 库的未解析符号

python - 使用 Python 和 ODRPACK 拟合参数的约束

python - 保存后维护通过信号填充的模型之间的关系

python - 将颜色应用于渐变方向

html - 使用 :after 的输入按钮内的 FontAwesome 图标

html - 如何知道 anchor 元素使用什么字体系列

Python 计算机间通信

css - 尽管 Google 表示该字符确实存在,但网络版的 Noto Serif 字体似乎缺少 Dagger 字符

php - imageMagick gif 移出框架