8

I had opened an image using PIL, as

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

Draw some text on it, as

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

and then saved it as

image.save("SomeOtherName.png")

to open it using pygame.image

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

I just want to do it without saving.. Can that be possible? It is taking a lot of time to save and then load(0.12 sec Yes, that is more as I have multiple images which require this operation). Can that save method be surpassed?

Rabbid76
  • 202,892
  • 27
  • 131
  • 174
phaigeim
  • 729
  • 13
  • 34

2 Answers2

11

Sadly the accepted answer doesn't work anymore, because Image.tostring() has been removed. It has been replaced by Image.tobytes(). See Pillow - Image Module.

Function to convert a PIL Image to a pygame.Surface object:

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

It is recommended to convert() the Surface to have the same pixel format as the display Surface.


Minimal example:

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()
Rabbid76
  • 202,892
  • 27
  • 131
  • 174
10

You could use the fromstring() function from pygame.image. The following should work, according to the documentation:

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)
miindlek
  • 3,523
  • 14
  • 25