Amélioration des performances en chargeant les photos en dehors de la boucle principale via l'utilisation d'un thread. Utilisation d'Surface intermédiaire pour éviter de remplir l'écran de noir à chaque itération.

This commit is contained in:
Guillaume Archambault 2023-04-19 12:09:53 +02:00
parent c375f925d1
commit 1c3db38c5e

60
main.py
View File

@ -1,16 +1,19 @@
import os
from PIL import Image
import pygame
import threading
# Chemin vers le dossier contenant les images
IMAGE_DIR = './photos'
# Initialisation de Pygame
pygame.init()
pygame.display.set_caption("Diaporama")
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
# Créez une nouvelle surface pour dessiner les images et les logos
intermediate_surface = pygame.Surface(screen.get_size())
# Logos Play, Pause, Next, Previous
LOGO_SIZE = (200, 200)
@ -32,13 +35,25 @@ previous_logo_rect = previous_logo.get_rect(midleft=(screen.get_rect().left + 20
# Chargement des images dans une liste
images = []
# Fonction pour charger une image en utilisant un thread
def load_image(image_path):
with Image.open(image_path) as img:
img.thumbnail(screen.get_size())
images.append(pygame.image.fromstring(img.tobytes(), img.size, "RGB"))
# Création des threads pour charger les images
image_threads = []
for file_name in os.listdir(IMAGE_DIR):
if file_name.endswith('.jpg') or file_name.endswith('.png'):
image_path = os.path.join(IMAGE_DIR, file_name)
with Image.open(image_path) as img:
# Redimensionnement de l'image en conservant le ratio d'aspect
img.thumbnail(screen.get_size())
images.append(pygame.image.fromstring(img.tobytes(), img.size, "RGB"))
image_thread = threading.Thread(target=load_image, args=(image_path,))
image_threads.append(image_thread)
image_thread.start()
# Attente de la fin du chargement de toutes les images
for image_thread in image_threads:
image_thread.join()
# Définition des zones d'affichage
screen_width, screen_height = screen.get_size()
@ -51,6 +66,9 @@ current_image_index = 0
next_image_time = pygame.time.get_ticks() + 5000
is_paused = False
image = images[current_image_index]
image_rect = image.get_rect(center=screen.get_rect().center)
# Boucle principale
running = True
while running:
@ -68,7 +86,6 @@ while running:
pygame.display.flip()
pygame.time.delay(1000) # Pause de 1 seconde avant de masquer le logo
screen.fill((0, 0, 0))
previous_image_time = pygame.time.get_ticks() + 5000
elif event.key == pygame.K_RIGHT:
screen.blit(next_logo, next_logo_rect)
current_image_index = (current_image_index + 1) % len(images)
@ -118,29 +135,20 @@ while running:
screen.fill((0, 0, 0))
next_image_time = pygame.time.get_ticks() + 5000
# Affichage de l'image actuelle
image = images[current_image_index]
image_rect = image.get_rect(center=screen.get_rect().center)
# Dessinez l'image actuelle sur la surface intermédiaire
intermediate_surface.fill((0, 0, 0))
intermediate_surface.blit(image, image_rect)
# Dessinez la surface intermédiaire sur l'écran
screen.blit(intermediate_surface, (0, 0))
pygame.display.flip()
if not is_paused and pygame.time.get_ticks() >= next_image_time:
current_image_index = (current_image_index + 1) % len(images)
next_image_time = pygame.time.get_ticks() + 5000
image = images[current_image_index]
image_rect = image.get_rect(center=screen.get_rect().center)
screen.fill((0, 0, 0))
screen.blit(image, image_rect)
pygame.display.flip()
# Gestion des logos
if pygame.time.get_ticks() < next_image_time:
if not is_paused:
screen.blit(play_logo, play_logo_rect)
else:
screen.blit(pause_logo, pause_logo_rect)
pygame.time.wait(1000)
screen.fill((0, 0, 0))
screen.blit(image, image_rect)
pygame.display.flip()
# Fermeture de Pygame
pygame.quit()