PIL与pygame.image

10 投票
2 回答
10140 浏览
提问于 2025-04-18 16:32

我用PIL打开了一张图片,代码如下:

image = Image.open("SomeImage.png")

然后在上面写了一些文字,代码是:

draw = ImageDraw.Draw(image)
draw.text(Some parameters here)

接着我把它保存成了:

image.save("SomeOtherName.png")

然后用pygame.image打开它,代码如下:

this_image = pygame.image.load("SomeOtherName.png")

我想知道有没有办法不保存就直接使用呢?因为保存和加载的时间太长了(0.12秒,没错,这个时间对我来说有点多,因为我有很多张图片需要这样处理)。有没有办法绕过这个保存的步骤呢?

2 个回答

14

很遗憾,之前的答案现在不再有效,因为 Image.tostring() 这个方法已经被移除了。现在用的是 Image.tobytes()。你可以查看 Pillow - Image 模块 来了解更多信息。

下面是一个将 PIL Image 转换为 pygame.Surface 对象的函数:

def pilImageToSurface(pilImage):
    return pygame.image.fromstring(
        pilImage.tobytes(), pilImage.size, pilImage.mode).convert()

建议使用 convert() 方法来将 Surface 转换成与显示的 Surface 拥有相同的像素格式。


下面是一个简单的示例:

import pygame
from PIL import Image

def pilImageToSurface(pilImage):
    return pygame.image.fromstring(
        pilImage.tobytes(), pilImage.size, pilImage.mode).convert()

pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()

pilImage = Image.open('myimage.png')
pygameSurface = pilImageToSurface(pilImage)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.fill(0)
    window.blit(pygameSurface, pygameSurface.get_rect(center = (250, 250)))
    pygame.display.flip()
10

你可以使用 pygame.image 里的 fromstring() 函数。根据说明,这段代码应该可以正常运行:

image = Image.open("SomeImage.png")
draw = ImageDraw.Draw(image)
draw.text(Some parameters here)

mode = image.mode
size = image.size
data = image.tostring()

this_image = pygame.image.fromstring(data, size, mode)

撰写回答