在pygame中将文本适合现有Surface

时间:2016-07-18 13:25:27

标签: python-3.x pygame

我正在尝试创建大小相同的文本表面,无论文本如何。换句话说:我希望较长的文本具有较小的字体大小和较短的文本以具有较大的字体大小,以使文本适合已存在的Surface。

要在pygame中创建文本我是:

  1. 创建字体对象。例如:font = pygame.font.SysFont('Arial', 32)
  2. 从字体对象创建文本表面。例如:text = font.render('My text', True, (255, 255, 255))
  3. 显示文字表面。
  4. 问题是我首先需要在创建文本表面之前创建一定大小的字体对象。我已经创建了一个能够实现我想要的功能:

    import pygame
    import sys
    
    def get_text(surface, text, color=(255, 255, 255), max_size=128, font_name='Arial'):
        """ Returns a text surface that fits inside given surface. Text
            will have a font size of 'max_size' or less.
        """
        surface_width, surface_height = surface.get_size()
        lower, upper = 0, max_size
        while True:
            font = pygame.font.SysFont(font_name, max_size)
            font_width, font_height = font.size(text)
    
            if upper - lower <= 1:
                return font.render(text, True, color)
            elif max_size < 1:
                print("Text can't fit in the given surface.", file=sys.stderr)
                raise ValueError
            elif font_width > surface_width or font_height > surface_height:
                upper = max_size
                max_size = (lower + upper) // 2
            elif font_width < surface_width or font_height < surface_height:
                lower = max_size
                max_size = (lower + upper) // 2
            else:
                return font.render(text, True, color)
    

    有没有其他方法可以解决这个更清洁和/或更高效的问题?

2 个答案:

答案 0 :(得分:0)

不幸的是,这似乎是最合适的解决方案。字体大小更近似,并且字体之间也有所不同,因此没有统一的方法来计算特定字体所占的面积。另一个问题是某些字符的字体大小有所不同。

从理论上讲,拥有等宽字体会使计算效率更高。只需将表面的宽度除以字符串的长度,然后检查等宽字体的哪种大小可以覆盖该区域。

答案 1 :(得分:0)

您可以重新缩放文本图像以适合:

  def fit_text_to_width(text, color, pixels, font_face = None):
    font = pygame.font.SysFont(font_face, pixels *3 // len(text) ) 
    text_surface = font.render(text, True, color)
    size = text_surface.get_size()
    size = ( pixels, int(size[1] * pixels / size[0]) )
    return pygame.transform.scale(text_surface, size)