是否可以从基于像素的彩色图像创建字体? (对于 Pygame,但也有其他情况)
Is it possible to create a Font from a pixel-based colour image? (for Pygame, but also otherwise)
我一直在使用 Pygame 并且 运行 遇到了问题。我想使用带有金属外观字符的自定义字体,但我不知道如何。
更准确地说,我想创建类似于此处图片的文本:
我所知道的所有字体类型都是基于黑白(我认为是基于矢量)图像,但据我所知,这是为了使它们可缩放并允许它们改变颜色——我不然而,出于我的目的需要这种功能。
是否有一种字体格式或其他方法可以使用 png/tif/bmp/some 其他基于像素的图片格式创建 'fancy'、多色使用字体?
大多数 "early" 字体格式都基于位图字体,因此您可能会很幸运。
对于一个简单的案例,pygame here 有一个 "bitmapped font" 片段。这不会实现(单词)环绕和其他花哨的东西。
但是,您也可以或多或少地轻松地自己滚动:
- 使用示例中字体中的字符创建一个大位图。
- 在位图中创建一个地图字符 -> 矩形。在最简单的情况下,你只需要每个字符的宽度(当所有字符的宽度相同时更简单)
- 在您的渲染函数中,将一串字符作为输入和起始位置。
- 从您的字符串中查找每个字符,从左到右呈现字符,向左移动刚刚显示的字符的宽度。
希望对您有所帮助
我不知道 PyGame,但 OpenType 有一些规范可以满足您的需求。唯一的问题:渲染字体的东西必须支持这些 new and bleeding edge specs。例如,在浏览器领域,其中一些技术在 Firefox 中有效,一些在 IE11 中有效,还有一些仅当它作为系统字体安装在 Mac.
上时有效
我没有找到支持颜色的位图字体格式(更不用说使用 python 3.4/pygame),但是下面 user3191557 提供的其他解决方案让我在右边跟踪。
我最终创建了一个 png 图像,其中从左到右包含我需要的字符串(图像中的所有字符都相同 spaced/sized)。在我的例子中,我只需要从 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 位置在 window 中。很有魅力。
您实际上不需要库或 "font"。这不是字体,它是一组位图。你可以使用一些 sprite class,甚至 pyGame 中还有一个内置的,但我个人从未使用过,所以不知道)。我会做什么:
1. 设置一个 table 与你的每个字母位图的宽度。
2. 使用与 table 中具有相同索引和宽度的位图设置表面列表
3. 设置绘制文本行的函数,其中将根据相应的宽度计算下一个要块传输的字符的 X 坐标。
而且固定宽度会简单很多,但是你的字体不是固定宽度的。
我一直在使用 Pygame 并且 运行 遇到了问题。我想使用带有金属外观字符的自定义字体,但我不知道如何。
更准确地说,我想创建类似于此处图片的文本:
我所知道的所有字体类型都是基于黑白(我认为是基于矢量)图像,但据我所知,这是为了使它们可缩放并允许它们改变颜色——我不然而,出于我的目的需要这种功能。
是否有一种字体格式或其他方法可以使用 png/tif/bmp/some 其他基于像素的图片格式创建 'fancy'、多色使用字体?
大多数 "early" 字体格式都基于位图字体,因此您可能会很幸运。
对于一个简单的案例,pygame here 有一个 "bitmapped font" 片段。这不会实现(单词)环绕和其他花哨的东西。
但是,您也可以或多或少地轻松地自己滚动:
- 使用示例中字体中的字符创建一个大位图。
- 在位图中创建一个地图字符 -> 矩形。在最简单的情况下,你只需要每个字符的宽度(当所有字符的宽度相同时更简单)
- 在您的渲染函数中,将一串字符作为输入和起始位置。
- 从您的字符串中查找每个字符,从左到右呈现字符,向左移动刚刚显示的字符的宽度。
希望对您有所帮助
我不知道 PyGame,但 OpenType 有一些规范可以满足您的需求。唯一的问题:渲染字体的东西必须支持这些 new and bleeding edge specs。例如,在浏览器领域,其中一些技术在 Firefox 中有效,一些在 IE11 中有效,还有一些仅当它作为系统字体安装在 Mac.
上时有效我没有找到支持颜色的位图字体格式(更不用说使用 python 3.4/pygame),但是下面 user3191557 提供的其他解决方案让我在右边跟踪。
我最终创建了一个 png 图像,其中从左到右包含我需要的字符串(图像中的所有字符都相同 spaced/sized)。在我的例子中,我只需要从 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 位置在 window 中。很有魅力。
您实际上不需要库或 "font"。这不是字体,它是一组位图。你可以使用一些 sprite class,甚至 pyGame 中还有一个内置的,但我个人从未使用过,所以不知道)。我会做什么: 1. 设置一个 table 与你的每个字母位图的宽度。 2. 使用与 table 中具有相同索引和宽度的位图设置表面列表 3. 设置绘制文本行的函数,其中将根据相应的宽度计算下一个要块传输的字符的 X 坐标。
而且固定宽度会简单很多,但是你的字体不是固定宽度的。