PIL и pygame.image
Я открыл изображение с помощью 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 сек. Да, это больше, так как у меня есть несколько изображений, которые требуют этой операции). Можно ли превзойти этот метод сохранения?
1 ответ
Вы могли бы использовать 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)
К сожалению, принятый ответ больше не работает, потому что
Image.tostring()
был удален. Он был заменен на
Image.tobytes()
. См. Подушку -
Image
Модуль.
Функция для преобразования PIL
Image
к pygame.Surface
объект:
def pilImageToSurface(pilImage):
return pygame.image.fromstring(
pilImage.tobytes(), pilImage.size, pilImage.mode).convert()
Рекомендуется convert()
поверхности, чтобы иметь один и тот же формат пикселя в качестве дисплея поверхности.
Минимальный пример:
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()