Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 974
phaigeim Avatar asked Aug 08 '14 11:08

phaigeim


People also ask

What is PIL in image?

Python Imaging Library (PIL) PIL is an additional, free, open-source library for the Python programming language that provides support for opening, manipulating, and saving many different image file formats.

How do I use PIL to show an image?

Python – Display Image using PIL To show or display an image in Python Pillow, you can use show() method on an image object. The show() method writes the image to a temporary file and then triggers the default program to display that image. Once the program execution is completed, the temporary file will be deleted.

How do I convert an image to pygame surface?

Step 1: First, import the libraries Image and Pygame. Step 2: Now, take the colors as input that you want to use in the game. Step 3: Then, construct the GUI game. Step 4: Further, set the dimensions of your GUI game.

Can pygame handle image formats?

Pygame is able to load images onto Surface objects from PNG, JPG, GIF, and BMP image files. The differences between these image file formats is described at http://invpy.com/formats.

How to convert from PIL to Pygame?

When you have to use both PIL and Pygame because missing functionalities in both of them, you need a way to convert between Pygame Surfaces and PIL Images, preferably without writing them to the disk. For that you can use "tostring" and "fromstring" functions provided in both libraries. Conversion from PIL to Pygame:

How to display image using pygame?

Show the display surface object on the pygame window using display.update () method of pygame. Now, let’s see the code displaying image using pygame : # activate the pygame library . # to use pygame's functionality. # of specific dimension..e (X, Y). # create a surface object, image is drawn on it. # (0, 0) coordinate.

What is Pygame surface image?

Pygame Surface Image: A surface that not only has fixed resolution and pixel format but also represents the image in Pygame is known as Pygame Surface Image.

How to scale and flip images in Pygame?

The pygame.transform module provides methods for scaling, rotating and flipping images. As we are going to modify the image img we keep the original image in a variable called img0: img0 = pygame.image.load(path) img0.convert() In order to show the image rectangle, we add a green border to the original image:


2 Answers

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()
like image 147
Rabbid76 Avatar answered Oct 23 '22 01:10

Rabbid76


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)
like image 10
miindlek Avatar answered Oct 23 '22 01:10

miindlek