Newsgroup: it.comp.java
Titolo: Visualizzare immagine

Per chi ha voglia di leggerselo, secondo voi perché il codice sotto
riportato non visualizza niente?(mi aspettavo che visualizzasse
un'immagine).
Grazie
------------------------------------------
package immagine;
import java.awt.*;
import java.awt.image.*;
public class PreviewImg extends Frame{
int width = 200;
int height = 200;
String nomeImmagine = "paradiso.jpg";
Image oldImg;
Image img;
BufferedImage bi;
Frame observer;
          public PreviewImg(){
         oldImg = Toolkit.getDefaultToolkit().getImage(nomeImmagine);
         img = oldImg.getScaledInstance(width, height, Image.SCALE_DEFAULT);
         bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
 
         setSize(width, height);
        setVisible(true);
     }
 
     public void paint(Graphics gg){
 
    Graphics2D g = (Graphics2D)gg;
 
    g = bi.createGraphics();
 
    // set up for rendering
    g.setBackground(Color.black);
    g.clearRect(0,0,width,height);
    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
    g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
 
    // render the image
     g.drawImage(img,0,0,width,height,observer);
 
    System.out.println("siamo qui dentro");
  }
}
--------------------------------
Inviato via 
http://usenet.libero.it

> secondo voi perché il codice sotto riportato non visualizza niente?
Secondo me, perché c'è qualche errore di troppo ;)
Analizziamo il codice (non tutto ovvio)
public class PreviewImg extends Frame{
    public PreviewImg(){
        oldImg = Toolkit.getDefaultToolkit().getImage(nomeImmagine);  // Ok
        // Ops, già quì c'è qualcosa che non va.............
        // Le immagini vengono caricate in maniera asincrona.
        // se vuoi renderle sincrone rispetto all'esecuzione del codice
        // devi utilizzare MediaTracker ed attendere l'avvenuto caricamento
di tutte
        // le immagini
        /*
            // MediaTracker vuole un Component, che guarda caso implementa
un ImageObserver.
            MediaTracker mt = new MediaTracker(this);
            mt.addImage(tuaImmagine,idx); //Idx è l'indice dell'immagine
            try{
                mt.waitForAll();//Attende che tutte le immagini siano
correttamente caricate
                //Oppure
                mt.waitForID(idx);//Attende che solo l'immagine idx sia
correttamente caricata
            }catch(InterruptedExcpetion e){.........}
        */
        img = oldImg.getScaledInstance(width, height, Image.SCALE_DEFAULT);
        bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        setSize(width, height);
        setVisible(true);
    }
    public void paint(Graphics gg){
        // Ti ricavi un contesto grafico 2D da quello che il tuo oggetto ti
passa.
        Graphics2D g = (Graphics2D)gg;
        // ERRORE!!!
        // Hai assegnto a [g] il contesto grafico 2D derivato dal tuo
componente
        // e ora gli assegni il contesto grafico della BufferedImage?
        // Devi decidere cosa fare, altrimenti il PC non è che inventa :)
        g = bi.createGraphics();
        // A che ti servono tutte ste cose?
        // Devi solo disegnare un'immagine
        g.setBackground(Color.black);
        g.clearRect(0,0,width,height);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_RENDERING,
        RenderingHints.VALUE_RENDER_QUALITY);
        // render the image
        g.drawImage(img,0,0,width,height,observer);
        System.out.println("siamo qui dentro");
        // Chi disegna l'immagine?
        // Dopo tutta sta manfrina, non scarichi l'immagine a video.
        // gg.draImage(............ chi lo fa?
        // Almeno questa istruzione è necessaria.
        ((Graphics2D)gg).drawImage(bi,0,0,null);
    }
}
Ti consiglio vivamente di ripensare questa classe e di prevedere un metodo
per settare dinamicamente l'immagine.
Tutte quelle cose sul BufferedImage etc. non ti servono, creati una seri di
setImage per risolvere alcune problematiche tipo :
    -    setImage(String path)
    -    setImage(Image img)
    -    setImage(BufferedImage img)
Da tutti e tre ti ricavi un BufferedImage che lo visualizzi secco dentro il
paint:
public void paint(Graphics g){
    if(bi!=null)
        ((Graphics2D)gg).drawImage(bi,0,0,null);
}
Bye

Molto gentile.
Gracias!


De nada ;)
P.S. cmq, su questo NG, il tuo quesito č stato trattato milioni (?) di
volte. Cerca con i gruppi di google, troverai un casino di esempi, con tanto
di codice fatto, spiegazioni, trucchi etc.


Effettivamente, ho fatto una ricerca prima di cominciare, tuttavia ero in
difficoltà lo stesso...
Ora, ho cercato di rifarla in maniera più semplice possibile, ma ottengo
solo un Null Pointer Exception quando chiama il paint...
Beh io il codice lo incollo, casomai qualcuno volesse darci un'occhiata...
package immagine;
import java.awt.*;
import java.awt.image.*;
public class PreviewImg extends Frame{
		Image img;
		Image scaledImg;
		//BufferedImage bi;
 
	public PreviewImg(String percorso, int width, int height){
		setVisible(true);
		setSize(width, height);
		caricaImmagine(percorso,width,height);
	}
 
	public void caricaImmagine(String percorso, int width, int height){
 
		img = Toolkit.getDefaultToolkit().getImage(percorso);
		//bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
		scaledImg = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
		MediaTracker mt = new MediaTracker(this);
		mt.addImage(img, 0);
		mt.addImage(scaledImg, 1);
		try{
			mt.waitForAll();
		}
		catch(InterruptedException ie){
			System.out.println(ie.toString());
		}
 
	}
 
	public void paint(Graphics g){
			((Graphics2D)g).drawImage(scaledImg,0,0,null);


Aggiungo che, se aspetto un pņ di tempo (verosimilmente, il tempo necessario
al caricamento dell'immagine), ridimensionando la finestra (quindi
obbligandolo a chiamare di nuovo paint()) l'immagine viene visualizzata
correttamente.
Credo che quindi l'errore sia nel modo in cui uso MediaTracker...


Concludo rispondendomi da solo, nel caso che qualcuno dovesse incontrare gli
stessi problemi...
E' stato sufficiente far effettuare la chiamata a caricaImmagine() PRIMA di
settare le opzioni del frame. Infatti, le operazioni sul Frame tipo
setVisible() eccetera, causavano la chiamata a paint(), prima che venisse
caricata l'immagine.
	public PreviewImg(String percorso, int width, int height){
		caricaImmagine(percorso,width,height);
		setVisible(true);
		setSize(width, height);
		setResizable(false);


Paolo, Paolo, Paolo..........................
public PreviewImg(String percorso, int width, int height){
    setVisible(true);
    //^^^^^^^^--> Che fai, prima visualizzi il tuo componente
    // e poi pretendi che il paint trovi un'immagine
    // che ancora deve essere caricata?
    //Togli questa istruzione e fai dall'esterno questa operazione.
    setSize(width, height);
    caricaImmagine(percorso,width,height);
}
public void caricaImmagine(String percorso, int width, int height){
    img = Toolkit.getDefaultToolkit().getImage(percorso);
    scaledImg = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
    // ^^^^ -----> Secondo te il resize di un'immagine
    // che ancora non è stata caricata, cosa ti produce?
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(img, 0);
    try{
        mt.waitForAll();
    }
    catch(InterruptedException ie){
        System.out.println(ie.toString());
    }
    scaledImg = img.getScaledInstance(width, height, Image.SCALE_DEFAULT);
    //^^^^ ---- ora puoi fare il resize
}

 // che ancora non è stata caricata, cosa ti produce?
Sì, effettivamente me ne ero accorto (dopo un pò, non subito ;) ), e avevo
già risolto.
Ad ogni modo, grazie per la risposta.
