Roughly approximate the width of a string of text in Python?

前端 未结 3 677
误落风尘
误落风尘 2021-01-12 16:34

How would one, using Python, approximate the font width of a given string of text?

I am looking for a function with a prototype similar to:

def getA         


        
相关标签:
3条回答
  • 2021-01-12 16:53

    You could render an image with the text using PIL and then determine the resulting image width.

    http://effbot.org/imagingbook/imagefont.htm

    0 讨论(0)
  • 2021-01-12 16:55

    I have used a library that does this however it requires pygame: http://inside.catlin.edu/site/compsci/ics/python/graphics.py Look under sizeString

    0 讨论(0)
  • 2021-01-12 17:07

    Below is my simple solution, which gets you on the order of 80% accuracy, perfect for my purposes. It only works for Arial and it assumes 12 pt font, but it's probably proportional to other fonts as well.

    def getApproximateArialStringWidth(st):
        size = 0 # in milinches
        for s in st:
            if s in 'lij|\' ': size += 37
            elif s in '![]fI.,:;/\\t': size += 50
            elif s in '`-(){}r"': size += 60
            elif s in '*^zcsJkvxy': size += 85
            elif s in 'aebdhnopqug#$L+<>=?_~FZT' + string.digits: size += 95
            elif s in 'BSPEAKVXY&UwNRCHD': size += 112
            elif s in 'QGOMm%W@': size += 135
            else: size += 50
        return size * 6 / 1000.0 # Convert to picas
    

    And if you want to truncate a string, here it is:

    def truncateToApproximateArialWidth(st, width):
        size = 0 # 1000 = 1 inch
        width = width * 1000 / 6 # Convert from picas to miliinches
        for i, s in enumerate(st):
            if s in 'lij|\' ': size += 37
            elif s in '![]fI.,:;/\\t': size += 50
            elif s in '`-(){}r"': size += 60
            elif s in '*^zcsJkvxy': size += 85
            elif s in 'aebdhnopqug#$L+<>=?_~FZT' + string.digits: size += 95
            elif s in 'BSPEAKVXY&UwNRCHD': size += 112
            elif s in 'QGOMm%W@': size += 135
            else: size += 50
            if size >= width:
                return st[:i+1]
        return st
    

    Then the following:

    >> width = 15
    >> print truncateToApproxArialWidth("the quick brown fox jumps over the lazy dog", width) 
    the quick brown fox jumps over the
    >> print truncateToApproxArialWidth("THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG", width) 
    THE QUICK BROWN FOX JUMPS
    

    When rendered, those strings are roughly the same width:

    the quick brown fox jumps over the

    THE QUICK BROWN FOX JUMPS

    0 讨论(0)
提交回复
热议问题