Forum
>>
Principianti
>>
Export immagine Turtle
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da Pawn371 ![]() |
2025-05-09 16:37:11 - Export immagine Turtle
|
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. |
|
Scritto da nuzzopippo ![]() |
2025-05-10 12:03:01 - Re: Export immagine Turtle
|
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 salvalo 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... |
|
Scritto da Pawn371 ![]() |
2025-05-10 14:43:58 - Re: Export immagine Turtle
|
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! |
|
Scritto da nuzzopippo ![]() |
2025-05-11 08:45:52 - Re: Export immagine Turtle
|
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 salvaed 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... |
|
Scritto da Pawn371 ![]() |
2025-05-13 10:51:03 - Re: Export immagine Turtle
|
Alla fine cercando ho trovato il modulo svg-turtle, dopo qualche tentativo sono riuscito a farlo funzionare, il risultato è un svg che poi posso modificare con Inkscape.
Grazie! |
|
Scritto da nuzzopippo ![]() |
2025-05-17 10:40:01 - Re: Export immagine Turtle
|
Ciao, ho provato il pacchetto svg_turtle, non mi sembra che risolva il Tuo problema, certamente è interessante il formato vettoriale e la trasparenza ma, purtroppo, non riporta completamente le immagini, prova questo esempio :
from svg_turtle import SvgTurtle # DISEGNA tart = SvgTurtle() tart.color('red') for j in range(360): for i in range(4): tart.forward(50+j) tart.left(90) tart.left(4) tart.save_as('test_04.svg') #la salvaDocumentazione pessima e, guardando il codice, decisamente "povero" di opzioni. Cercando, sempre sul formato svg, ho trovato il modulo "canvasvg", anche questo con documentazione penosa ma ha una funzione interessante "saveall", che salva l'intero contenuto del canvas che riceve quale parametro, oltre a permettere di definire un bordo immagine a piacere, un esempio: import turtle from canvasvg import saveall # 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 saveall('test_04b.svg', wdg)Suggerirei di guardare anche quest'ultimo modulo. Fatti non foste a viver come bruti... |
|
Scritto da Pawn371 ![]() |
2025-05-22 21:21:56 - Re: Export immagine Turtle
|
Ho provato anche la seconda soluzione, funziona. A differenza della prima non devo inserire le dimensioni, e prende tutto il disegno in automatico.
La cosa che ho notato è che se imposto il colore dello sfondo della finestra di turtle con il comando screen.bgcolor("black"), questo non mi viene importato nell'immagine. È normale? Occorre qualche altro comando? Grazie! |
|
Scritto da nuzzopippo ![]() |
2025-05-23 11:19:41 - Re: Export immagine Turtle
|
Normale? ... suppongo di si, essendo il formato svg usato per grafica vettoriale, da ricerche fatte in giro mi par di capire che per ottenere uno sfondo èer tale formato bisogna crearsi un rettangolo, ma non posso dire di conoscere tale formato di immagine.
Per altro, dalla poca documentazione disponibile e dalla valutazione del codice sorgente di canvas2svg mi sembra proprio che tale opzione non sia prevista ... comunque, è piuttosto semplice* ovviare creando un rettangolo di sfondo che contenga il disegno, questo è un test variando l'ultimo esempio : import turtle from canvasvg import saveall def make_bg(cnv: object, margin: int=10, bd_col: str='', bd_size: int=1) -> object: ''' Disegna un rettangolo con funzione di "sfondo" del colore assegnato a turtle, si tenga presente che il canvas non lo contiene PARAMETRI : cnv : oggetto tkinter.canvas margin : margine, in pixel, ripetto al disegno bd_col : colore di bordo, se nullo viene ignorato bd_size: spessore, in pixwl, del bordo del rettangolo ''' x1, y1, x2, y2 = cnv.bbox('all') # bgc = cnv['background'] -- così non va bgc = turtle.bgcolor() if bd_col: rect = cnv.create_rectangle(x1 - margin, y1 - margin, x2 + margin, y2 + margin, outline = bd_col, fill = bgc, width = bd_size) else: rect = cnv.create_rectangle(x1 - margin, y1 - margin, x2 + margin, y2 + margin, fill = bgc, width=0) cnv.tag_lower(rect) return cnv # DISEGNA turtle.bgcolor('yellow') 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 # disegno pseudo-sfondo con bordo rosso di 2 pixel wdg = make_bg(wdg, bd_col='red', bd_size=2) saveall('test_04c.svg', wdg) # lo salva con 10 pixwel di sfondo trasparenteSpero Ti sia utile * = semplice, ovviamente, conoscendo python e consultando la documentazione di tkinter, non credo sia pane per i denti di ChatGPT e simili AI che, dopo tutto, sono solo algoritmi euristici (quindi statistici) che seppur fantastici non hanno niente di "intelligente" Fatti non foste a viver come bruti... |
Pagina: 1
Esegui il login per scrivere una risposta.