from psychopy import visual, core, event import imageio import numpy as np import os # Funzione per ottenere tutti i percorsi delle immagini in una cartella def get_image_paths(folder_path, extensions=['.png', '.jpg', '.jpeg']): return [os.path.join(folder_path, f) for f in os.listdir(folder_path) if os.path.splitext(f)[1].lower() in extensions] # Specifica il percorso della cartella contenente le immagini image_folder = 'C:/Users/angel/OneDrive/Desktop/volti' # Ottieni l'elenco dei percorsi delle immagini image_paths = get_image_paths(image_folder) # Creazione della finestra win = visual.Window(size=(1920, 1080), units='pix', fullscr=True, color='black') win.setRecordFrameIntervals(False) # Disattivare la misurazione automatica del frame rate frame_rate = 60 # Imposta un frame rate esplicito frame_duration = 1.0 / frame_rate # Durata di un frame in secondi # Testo sopra in alto dello schermo text_message1 = visual.TextStim(win, text="forza italia", pos=(0, 480), height=40, color='black', wrapWidth=1800) text_message2 = visual.TextStim(win, text="tanti gattini", pos=(0, 410), height=30, color='black') text_message3 = visual.TextStim(win, text="ciao", pos=(0, 380), height=30, color='black') # Parametri del rettangolo di sfondo background_color = [0.5, 0.5, 0.5] # Grigio background_opacity = 1 # Opacità del rettangolo rectangle_height_cm = 4.5 # Altezza del rettangolo in cm rectangle_height_pix = rectangle_height_cm * 55.51 # Conversione da cm a pixel (1 cm ≈ 55.51 pixel) # Creazione del rettangolo di sfondo bg_rect = visual.Rect(win, width=1920, height=rectangle_height_pix, pos=(0, 450), fillColor=background_color, opacity=background_opacity) # Parametri delle linee line_width = 1.0 # in cm line_height = 1080 # altezza dello schermo in pixel (esempio) line_spacing = 1.0 # spazio tra le linee in cm luminosita = 0.5976 # Luminosità delle linee # Funzione per creare le linee def create_lines(start_x, num_lines): lines = [] x_start = start_x for i in range(num_lines): line = visual.Rect(win, width=line_width * 55.51, height=line_height, fillColor=[luminosita] * 3, lineColor=[luminosita] * 3) line.pos = (x_start, 0) lines.append(line) x_start += (line_width + line_spacing) * 55.51 # spostamento per la prossima linea return lines # Calcola il numero di linee necessarie per riempire lo schermo num_lines = int(1920 / ((line_width + line_spacing) * 55.51)) + 2 # Crea le linee inizialmente riempendo lo schermo da sinistra a destra lines = create_lines(-960, num_lines) # Funzione per il movimento delle linee def move_lines(lines, speed): for line in lines: line.pos -= (speed * frame_duration, 0) # Movimento verso sinistra if line.pos[0] < -960 - ((line_width + line_spacing) * 55.51) / 2: # Se la linea esce dal bordo sinistro line.pos[0] += num_lines * (line_width + line_spacing) * 55.51 # Riporta la linea al bordo destro # Durata di ogni immagine in secondi image_duration = 18 # Creare un video per ogni immagine nella lista for image_path in image_paths: # Caricamento dell'immagine central_image = visual.ImageStim(win, image=image_path, pos=(0, -110)) # Scala l'immagine del 0.8 central_image.size *= 0.9 # Nome del file video basato sul nome dell'immagine movie_name = os.path.splitext(os.path.basename(image_path))[0] + "_video.mp4" fps = 60 # Fissa il frame rate a 60 fps writer = imageio.get_writer(movie_name, fps=fps) print(f"Creando video: {movie_name}") # Timer di registrazione usando core.Clock timer = core.Clock() # Ripristina le linee e inizia la registrazione lines = create_lines(-960, num_lines) timer.reset() # Resetta il timer per ogni nuova immagine # Ciclo principale di presentazione try: while timer.getTime() < image_duration: # Controllo per l'uscita tramite il tasto 'esc' if 'escape' in event.getKeys(): writer.close() win.close() core.quit() print("Uscita dallo script") break # Movimento delle linee in base al tempo trascorso move_lines(lines, 466.284) # Disegnare le linee for line in lines: line.draw() # Disegna l'immagine centrale central_image.draw() # Disegna il rettangolo di sfondo bg_rect.draw() # Disegna il testo sopra in alto text_message1.draw() text_message2.draw() text_message3.draw() # Converti la finestra Psychopy in un array di immagini img_array = np.array(win.getMovieFrame(buffer='back')) writer.append_data(img_array) # Aggiungi l'array di immagini al writer del video # Aggiornamento dello schermo win.flip() finally: # Chiusura del writer e salvataggio del video writer.close() print(f"Video salvato in: {movie_name}") # Chiudi la finestra e termina win.close() core.quit()