PIL和pygame.image

时间:2014-08-08 11:06:52

标签: python image python-imaging-library

我使用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 个答案:

答案 0 :(得分:6)

您可以使用fromstring()中的pygame.image功能。根据文档,以下内容应该有效:

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)

答案 1 :(得分:2)

可悲的是,已接受的答案不再起作用,因为Image.tostring()已被删除。它已被Image.tobytes()取代。参见Pillow - Image Module

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()