PIL and pygame.image

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?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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

Method 2

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)


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x