Newsgroup: it.comp.java
Titolo: Come ottenere un Image con il contenuto di un Component per fare uno snapshot ?

Ciao a tutti , vorrei poter eseguire un'istantanea del contenuto di un Component e memorizzarla in un file (gif, bmp...)
Posto di trovare qualcosa che converta un Image in un file gif o simile.
Il problema e' recuperare l'immagine di cio' che e' visualizzato nel component.
Ho pensato di fare cosi':
	public static Image getImage(Component c) {
	  Dimension d = c.getSize();
	  Image i = c.createImage(d.height,d.width);
	  Graphics g = i.getGraphics();
	  c.update(g);
	  return i;   
	}
Tuttavia sembra non funzionare...
Ho provato anche ad usare paint() invece di update() ma non cambia nulla.
Forse e' sbagliato il programmino di testo che ho messo assieme.
Grazie a chi saprà darmi una dritta !
Per rispondere via email rimuovere NoNoNo
----Snapshot.java-----
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.applet.Applet;
public class Snapshot extends Applet
                        implements ActionListener {
Button b1;
TextArea textArea;
Panel panel;
static final String DO = "do";
    public void init() {
        b1 = new Button();
        b1.setLabel("Snapshot");
        b1.setActionCommand(DO);
        //Listen for actions on buttons 1 and 3.
        b1.addActionListener(this);
        textArea = new TextArea(5, 20);
        panel = new Panel();
        panel.setSize(300,300);
 
        add(b1);
        add(textArea);
        add(panel);
    }
    public static Image getImage(Component c) {
	  Dimension d = c.getSize();
	  Image i = c.createImage(d.height,d.width);
	  Graphics g = i.getGraphics();
	  c.update(g);
	  return i;   
   }
 
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
 
        if (command == DO) { 
           panel.getGraphics().drawImage(getImage(textArea),0,0,this);
           panel.repaint();
        } else {
          System.out.println("Action sconosciuto");
        }
    }
}	
#######################################################################
email:     remove "NoNoNo"
           rimuovi "NoNoNo"
homepage:  
http://www.geocities.com/SiliconValley/Pines/8427/
#######################################################################


Puoi utilizzare print() o printall() per forzare un Component ad eseguire un
update all'interno di un Graphics.
Il problema nel tuo codice non è tanto (credo) nella creazione dell'Image
ma, piuttosto, nel ridisegno della stessa. Tu ridisegni l'iimagine nel panel
e poi chiami la repaint() dello stesso che non fà altro che cancellarne il
contenuto "as soon as possible". Dovresti ridefinire un Component
(derivandolo dal canvas) che disegni un'immagine al suo interno, e quindi
richiamare il metodo repaint() dopo avergli assegnato l'immagine ritornata
dalla tua getImage.
---
Valter Minute
min...@fortech.it
 (the reply address of this message is invalid)
---
Are you looking for a good freeware ScreenSaver? Try FOYD!
http://hotfiles.zdnet.com/cgi-bin/texis/swlib/hotfiles/getit.bin?fcode=000PZ
0
if you want, I can send you the (free) C++ source code.


Grazie Valter !
Ho fatto come hai detto, avevi ragione.
Il metodo funziona...ma c'e' un pero'...
Poniamo che c1 sia un Component in cui e' stato ridefinito il metodo paint ad esempio una sottoclasse di Canvas.
Poniamo invece che c2 sia un Component "nativo" ad esempio un Button in cui nessuno a ridefinito il metodo paint.
Bene, invocando
  i1=getImage(c1);
  i2=getImage(c2);
  public static Image getImage(Component c) {
    Dimension d = c.getSize();
    Image i = c.createImage(d.height,d.width);
    Graphics g = i.getGraphics();
    c.paintAll(g); //ridisegno lui e i component inclusi.
    return i;
  }
i1 contiene l'immagine tracciata dal paint "customizzato" di c1
mentre i2 e' completamente del colore di sfondo di c2 ed ha delle dimenensioni diverse da quelle di c2...
Da quanto posso capire credo che i Component che si basano su interfaccia grafica nativa (peer) hanno metodi paint vuoti che quindi non fanno nulla...
Probabilmente i componenti light di swing mostrerebbero qualcosa non basandosi su nessun peer.
Ho  provato con componeti light di Swing ma non ci sono riuscito, sul mio pc il jdk1.2beta4 crasha sistematicamente...
Quindi ora il problema e' come ottenere l'Image da un Component standard ?
Ad esempio l'Image di un Component che contiene altri Componet al suo interno...
Allego il codice che ho usato per i test.
Grazie a chiunque saprà aiutarmi...
ahh pare che questo problema sia comune a molti !


Allego il codice che ho usato per i test.
Quando riesci a isolare un problema è meglio postare poche righe di codice
che permettano di riprodurre (almeno a livello "logico") il problema (come
hai fatto nel mail precedente) che allegare qualche Kb di codice che non
verrà letto da nessuno e non contribuirà certo a renderti popolare tra
quelli che hanno una connessione lenta :-)


NoNoNo...@iname.com
 (Valentino Miazzo) wrote:
Grazie ad una dritta di Larry Riedel ho trovato il modo giusto di operare.
public static Image getImage(Component c) {
    Rectangle r = c.getBounds();
    Image i = c.createImage(r.width,r.height);
    Graphics g = i.getGraphics();
    c.printAll(g);
    return i;
}
Ora funziona quasi tutto eccetto per il fatto che ad esempio i cursori delle textarea non vengono disegnati.
Allego 2 immagini per rendersi conto del problema e il sorgente del programma utilizzato.
Qualcuno sa cosa fare ?
Grazie ancora !
NB: il codice allegato penso sia ormai istruttivo coinvolge infatti:
- caricamento di immagini da una applicazione
- salvataggio di Image in formato GIF
- ottenere un Image che rapresenti il contenuto di un Component (da migliorare...)
- creazione di un Image da un array di dati RGB
Spero tanto sia utile a qualcuno !


quelli che hanno una connessione lenta :-)
Hai certamente ragione, pensavo che potesse essere didattico visto che non copre solo questo argomento.
Ora che ho postato delle GIF qualcuno mi odierà ! :-))
Ciao !
