Python 是否可以从基于像素的彩色图像创建字体?(适用于Pygame,但也适用于其他情况)
我一直在与Pygame合作,遇到了一个问题。我想使用一个金属外观的字符自定义字体,但我不知道如何 更准确地说,我想创建与此处图像类似的文本: 我所知道的所有字体类型都是基于黑白(我认为是基于矢量的)图像的,但据我所知,这是为了使它们具有可伸缩性并允许它们改变颜色——然而,我并不需要这种功能 是否有一种字体格式或其他方法来创建一种“奇特”的多色字体,如上述使用png/tif/bmp/其他一些基于像素的图片格式的字体?大多数“早期”字体格式都基于位图字体,因此您可能会很幸运 对于一个简单的例子,pygame有一个“位图字体”片段。这并没有实现(word)包装和其他花哨的东西 但是,您也可以或多或少轻松地推出自己的:Python 是否可以从基于像素的彩色图像创建字体?(适用于Pygame,但也适用于其他情况),python,fonts,colors,pygame,Python,Fonts,Colors,Pygame,我一直在与Pygame合作,遇到了一个问题。我想使用一个金属外观的字符自定义字体,但我不知道如何 更准确地说,我想创建与此处图像类似的文本: 我所知道的所有字体类型都是基于黑白(我认为是基于矢量的)图像的,但据我所知,这是为了使它们具有可伸缩性并允许它们改变颜色——然而,我并不需要这种功能 是否有一种字体格式或其他方法来创建一种“奇特”的多色字体,如上述使用png/tif/bmp/其他一些基于像素的图片格式的字体?大多数“早期”字体格式都基于位图字体,因此您可能会很幸运 对于一个简单的例子,p
- 如示例所示,使用字体中的字符创建一个大位图
- 在位图中创建贴图字符->矩形。在最简单的情况下,您只需要每个字符的宽度(如果所有字符的宽度相同,则更简单)
- 在渲染函数中,将字符串作为输入和起始位置
- 从字符串中查找每个字符,从左到右呈现字符,向左移动刚才显示的字符的宽度
希望这会有帮助,我不知道PyGame,但是OpenType有一些规范可以满足您的需要。唯一的问题是:呈现字体的东西必须支持这些。例如,在浏览器世界中,这些技术中的一些在Firefox中有效,一些在IE11中有效,还有一些仅在Mac上作为系统字体安装时有效
但是你可以做到我没有找到支持颜色的位图字体格式(更不用说使用python 3.4/pygame了),但是下面由用户3191557提供的另一个解决方案让我走上了正确的道路 我最终创建了一个png图像,其中包含了从左到右所需的字符串(图像中所有字符的间距/大小都相等)。在我的例子中,我只需要从0到9的数字。以下是我使用的代码(希望我没有遗漏任何相关内容):
这样,我就可以使用ActiveNumbers.write(string,(x,y))在窗口中的任意x,y位置写入我想要的任何字体字符串(当然,假设我有所需字符的图像)。工作起来很有魅力。实际上,你不需要库或“字体”。这不是字体,而是一组位图。你可以使用一些精灵类,甚至有一个内置的pyGame,但我通常从未使用过,所以不知道)。我要做的是: 1.设置一个表格,显示每个字母位图的宽度。 2.设置一个带有位图的曲面列表,位图的索引与表中的索引相同,宽度为 3.设置一个函数来绘制文本线,其中blit下一个字符的X坐标将根据相应的宽度计算
使用固定宽度会简单得多,但您的字体不是固定宽度。我喜欢使用一种“早期”位图字体格式,因为它的规格要求似乎很低(与OpenType不同)。但是,我看到的所有位图字体格式似乎都只支持单色图像。什么格式支持全彩位图?
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
...