是否可以从基于像素的彩色图像创建字体? (对于Pygame,还有其他)

时间:2015-02-10 10:53:40

标签: python fonts colors pygame

我一直在与Pygame合作并遇到了问题。我想使用带有金属字符的自定义字体,但我不知道如何。

更确切地说,我想在这里创建看起来像图像的文本: gold, metallic looking text

我所知道的所有字体类型都基于黑白(我认为基于矢量)图像,但据我所知,这是为了使它们可扩展并允许它们改变颜色 - 我不知道但是,我需要这种功能。

是否有字体格式或其他方法使用png / tif / bmp /其他一些基于像素的图片格式使用上面的字体创建一个奇特的多色?

4 个答案:

答案 0 :(得分:1)

大多数“早期”字体格式都是基于位图字体,所以你可能会很幸运。

对于一个简单的案例,pygame here有一个“位图字体”代码段。这不会实现(单词)包装和其他奇特的东西。

但是,你也可以或多或少地自己动手:

  • 使用字体中的字符创建一个大型位图,如示例所示。
  • 创建地图字符 - >位图中的矩形。在最简单的情况下,您只需要每个字符的宽度(当所有字符的宽度相同时更简单)
  • 在渲染功能中,将一串字符作为输入和起始位置。
  • 查找字符串中的每个字符,从左到右呈现字符,向左移动刚刚显示的字符的宽度。

希望有所帮助

答案 1 :(得分:1)

我不了解PyGame,但OpenType有一些规格可以准确地满足您的需求。唯一的问题是:呈现字体的东西必须支持这些new and bleeding edge specs。例如,在浏览器领域,其中一些技术在Firefox中有效,有些在IE11中,有些只在Mac上作为系统字体安装时才有效。

但你可以做colorful game fonts like these :)

答案 2 :(得分:0)

我没有找到支持颜色的位图字体格式(更不用说使用python 3.4 / pygame)了,但是下面的user3191557提供的另一个解决方案让我走上正轨。

我最终创建了一个png图像,其中包含我需要的字符串(图像中所有等间距/大小)从左到右。在我的情况下,我只需要从0到9的数字。这是我使用的代码(希望我没有错过任何相关的):

import pygame

WINDOWWIDTH = 1080
WINDOWHEIGHT = 1080
Window = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), pygame.FULLSCREEN)

class CustomFont: #The letterimage file must consist of equally-sized letters, each of 'lettersize', arranged in a single line, left-to-right.  The letterstring is a string representation of the letters in the image (in the same order).
    def __init__(self, letterstring, lettersize, letterimagefile):
        self.letterstring = tuple(letterstring)
        self.lettersize = lettersize
        self.letterimagefile = letterimagefile
    def write (self, string, position):
        stringseparated = tuple(string)
        for i in range(len(stringseparated)):
            letter = stringseparated[i]
            for j in range(len(self.letterstring)):
                if self.letterstring[j] == letter: #j gives us the index number of the letter in our original string
                    grabletterbox = ((self.lettersize[0] * j), 0, self.lettersize[0], self.lettersize[1]) #this defines the position of the rectangle that will grab the letter from our letterimage file, as well as the size of said rectangle     
                    Window.blit(self.letterimagefile, ((position[0] + (i * self.lettersize[0])),position[1]) , grabletterbox)

ActiveNumbersSprite = pygame.image.load('.\images\ActiveNumbers.png') #The image used for the numbers
ActiveNumbers = CustomFont('0123456789', (36 , 60), ActiveNumbersSprite) #This tells the program what characters the ActiveNumbersSprite image contains, in what order, how big each character is (as (x,y), and the name of the image file
...

有了这个,我可以使用ActiveNumbers.write(string,(x,y))在我的字体中写出我想要的任何字符串(假设我有所需字符的图像,当然)在任何x,y位置我想在窗口。像魅力一样。

答案 3 :(得分:0)

您实际上不需要lib或“font”。这不是字体,它是一组位图。你可以使用一些精灵类,甚至有一个内置的pyGame,但我从来没有使用过,所以不知道)。我会怎么做: 1.设置一个宽度为每个字母位图的表格。 2.设置一个表面列表,其中的位图具有与宽度表相同的索引 3.设置一个绘制文本行的函数,其中每个下一个字符的X坐标将从相应的宽度计算出来。

固定宽度会更简单,但你的字体不是固定宽度。