Forum >> Principianti >> Export immagine Turtle

Pagina: 1

Salve,



Da poco mi sto approcciando alla Generative Art utilizzando Python, ed in particolare il modulo Turtle.

Al momento la difficoltà principale che sto riscontrando è quella di salvare il risultato dei miei script in formato jpeg o png. Cercando su internet, ed aiutandomi con Chatgpt, sono riuscito ad ottenere di esportare solo la parte visibile nella finestra di Python, mentre se il disegno si allarga oltre i limiti della finestra questo viene tagliato.

Ho provato ad aumentare le dimensioni dello screen di Turtle, ma il risultato è lo stesso, ho la possibilità di vedere tutta l'immagine scorrendo con le barre laterali, ma comunque viene salvato solo la parte visibile all'inizio.

Qualcuno sa darmi indicazioni a riguardo?




Grazie in anticipo.
Non utilizzo turtle ma la Tua domanda mi ha intrigato, partendo dal presupposto che turtle si basa su tkinter, utilizzando la funzione "getcanvas()" di turtle si può estrarre ed utilizzare il canvas in maniera ordinaria.

Neanche "salvare" i contenuti di un canvas è cosa che ordinariamente faccio, però i canvas possono salvare il loro contenuto in formato postscript.

Utilizzando la classe Image di pillow, tali dati possono essere caricati e salvati in uno dei formati supportati da pillow, ti faccio un esempio:

import turtle
from PIL import Image
from io import BytesIO

# DISEGNA
tart = turtle.Turtle()

tart.color('red')
for j in range(180):
    for i in range(4):
        tart.forward(50+j)
        tart.left(90)
    tart.left(4)


wdg = turtle.getcanvas()  # recupera lo scrolled_canvas

# SALVA
ps_data = wdg.postscript(colormode='color')  # memorizza il contenuto come fosse
                                             # un file postscript
im = Image.open(BytesIO(bytes(ps_data, 'ascii')))  # crea una immagine dai dati
im.save('test_02.png')                             #la salva

lo script utilizza turtle per disegnare 180 quadrati in rosso, che nel loro insieme danno una doppia spirale piuttosto carina, poi vengono applicati i concetti sopra detti per creare una immagine png nella cartella di lancio.




Per utilizzare lo script si deve avere pillow installato, magari in un venv, sotto linux funziona tranquillamente, non saprei dire in ambiente windows (non lo uso)




Spero Ti sia utile
Fatti non foste a viver come bruti...
Ho provato ad applicare le istruzioni del tuo script al mio per salvare l'immagine, ma ottengo sempre il medesimo risultato, nel file png viene salvata solo la parte visibile a schermo del disegno.



Grazie!
beh, il mio voleva essere un semplice "la", mi aspettavo Tu ricorressi alla documentazione di tkinter.canvas per vedere un po' come vanno le cose, in tal caso, consultando la documentazione a proposito di tkinter.canvas.poscript avresti notato che vi sono vari parametri possibili, alcuni tra cui "dovrebbero" riferire alla "tela" del canvas, che ha coordinate proprie non inerenti quelle di visualizzazione dello schermo.

Tra l'altro, tkinter.canvas, ha la proprietà "bbox(namewidget)" che permette di estrarre le coordinate del rettangolo di contenzione di ogni singolo item disegnato (con "all" si ottengono le coordinate di contenzione dell'intero disegno) ... non mi ero impelagato ad approfondire, dato che non hai indicato il codice per ottenere il grafico per Te problematico.




Comunque, stante il Tuo problema, ho guardato un po', calcolandosi le coordinate della tela e valorizzando gli opportuni parametri di postscript riesco ad ottenere il disegno completo anche con gli elementi al di fuori della finestra, per far ciò ho raddoppiato il numero dei triengoli ed implementato le considerazioni sopra, il codice :

import turtle
from PIL import Image
from io import BytesIO

# DISEGNA
tart = turtle.Turtle()

tart.color('red')
for j in range(360):
    for i in range(4):
        tart.forward(50+j)
        tart.left(90)
    tart.left(4)


wdg = turtle.getcanvas()  # recupera lo scrolled_canvas
# coordinale e dimensioni della sola immagine
x1, y1, x2, y2 = wdg.bbox('all')
w, h = x2 - x1, y2 - y1

# SALVA
# applica i dati calcolati e crea il postscript della sola immagine
ps_data = wdg.postscript(colormode = 'color',
                         x = x1,
                         y = y1,
                         width = w,
                         height = h)
im = Image.open(BytesIO(bytes(ps_data, 'ascii')))  # crea una immagine dai dati
im.save('test_03.png')                             #la salva
ed a me funziona benissimo, provalo e fai sapere.




N.B. : le immagini sono cose complesse, tieni presente che potresti avere altri generi di problemi, tipo sui colori per differenze di palette, ovvero problemi sui pixel, se ricordo bene postscript e Image sono entrambi raw ma ps opera su 96 DPI mentre Image su 72 DPI, convertendo in formati bitmap potrebbero essere introdotti artefatti, corregibili con metodi di proporzionamento vari, gli altri parametri di postscript potrebbero essere d'aiuto.




Ciao
Fatti non foste a viver come bruti...


Pagina: 1



Esegui il login per scrivere una risposta.