Newsgroup: it.comp.java
Titolo: Esportare immagini dal Canvas ???

Saluti a tutti,
Ho disegnato alcuni oggetti (linee, quadrati) in un Canvas, come posso
salvare queste figure?
Mi piacerebbe salvarle in un formato standard come jpeg, eps, gif, ecc...
L'ottimo risultato sarebbe di poter salvare in un formato vettoriale come
.cnv, .pict, ecc...
Grazie per il vostro aiuto
    lorenko

Per adesso la cosa che mi viene in mente e far fare una snapshot del
componente e salvarla.
Nella classe Robot c'è questo metodo
createScreenCapture(Rectangle screenRect)
se non dovesse andare bene, ne esiste un altro, ma non ricordo dove l'ho
visto.
Ciao ^_^

Ahem... catturare direttamente uno snapshot dell'intero schermo mi sembra un
po' eccessivo...
Il mio consiglio è di procedere così:
Prima di tutto il tuo disegno dovrebbe prima essere composto fuori schermo
utilizzando un BufferedImage che manterrai a parte:
   BufferedImage buffer=new BufferedImage(larghezze,altezza,tipoimmagine);
...dove "tipoimmagine" può essere preso direttamente da una delle costanti
definite nella classe BufferedImage. Per un uso generico consiglio di
specificare BufferedImage.TYPE_INT_RGB che crea in memoria un buffer per
disegnare immagini con colori a 24 bit. Se ti serve utilizzare anche le
trasparenza usa allora BufferedImage.TYPE_INT_ARGB che ti mette a
disposizione ulteriori 8 bit (per un totale di 32) per il canale alpha.
Una volta creato il tuo buffer puoi disegnarci sopra come e quando vuoi,
ottenendo prima un oggetto di tipo Graphics2D:
   Graphics2D graph=buffer.createGraphics();
A questo punto ti consiglio di guardare la documentazione per avere un'idea
delle capacità della classe Graphics2D (e sono davvero tante!!!). Ci trovi i
metodi per disegnare linee, rettangoli, ovali, testo (con qualunque tipo di
font)... Un suggerimento: la classe Graphics2D deriva direttamente da
java.awt.Graphics, che sicuramente avrai usato per disegnare sul tuo Canvas
(immagino quindi direttamente sulla viewport dell'applet), quindi puoi
riportare direttamente tutto il codice che hai usato nel metodo
paint(Graphics g), utilizzando graph al posto di "g".
Quando avrai terminato di eseguire tutto il disegno sull'oggetto graph
(spero avrai capito che questa fase puoi eseguirla anche all'esterno di
paint()...) richiami graph.dispose() per liberare tutte le risorse
utilizzate per disegnare all'interno del BufferedImage, quindi aspetti solo
che il sistema richiami il paint() del tuo oggetto Canvas. Al suo interno
non dovrai fare altro che:
   public void paint(Graphics g) {
      g.drawImage(buffer,0,0,null);
   }
che trasferisce il contenuto del BufferedImage sul Canvas. Questo metodo ha
il vantaggio di aumentare le prestazioni, poichè il disegno viene effettuato
in un buffer a parte e quindi copiato a video solo quando necessario, senza
dover rieseguire ogni volta tutta la sequenza di disegno delle forme.
Veniamo adesso alla tua richiesta: salvare il tuo disegno in un file su
disco. Dalla versione 1.4.0 del Java SDK, la Sun ha incluso tutta una seria
di classi per esportare immagini su file. Si tratta del package
javax.imageio, e nonostante la documentazione "abbondi" di particolari,
l'esportazione su file richiederà pochissimi passi. Ti dirò la verità, non
ho ancora provato questo package, ma mi sembra che il metodo che fa per si
trova nella classe javax.imageio.ImageIO:
   javax.imageio.ImageIO.write(buffer,formato,filedestinazione);
Ovviamente questa chiamata deve essere preceduta da alcuni preparativi. Il
"file" può essere un oggetto di tipo file, e dovrà essere preparato con:
   File filedestinazione=new File(percorso);
"formato" è una stringa che indica quale sia il formato di destinazione
dell'immagine. Ora non ho idea di quali siano i formati accettati, per avere
un elenco puoi chiederlo direttamente alla classe ImageIO:
   String[] formati=javax.imageio.ImageIO.getWriterFormatNames();
Tra quelli guarda se c'è qualcosa che somigli a JPeg, o meglio, fatti
stampare la lista e scegli quello che più ti garba ;)
Per il "buffer" infine... beh, te lo devo dire io?
Fammi sapere come va :)
-------
"Lascia che gli eventi seguano la propria strada"

 wrote in message
news:ap0bu0$7oh$1...@nntp.weblinea.it...
