Newsgroup: it.comp.java
Titolo: drawImage

Salve a tutti
Ho la necessita'di utilizzare un immagine .gif in una applicazione java, ed
avrei bisogno di un immagine il cui background assumesse di volta in volta
gli stessi colori del disegno sottostante l'immagine .gif .
Questa immagine dovra' muoversi su un canvas non  monocromatico che assume
tonalita' diverse in varie regioni dello spazio a sua disposizione.
Cio' che a me interessa è mettere in evidenza lo spostamento del disegno
centrale della mia immagine .gif ( una sfera ) ed avrei dunque la necessita'
di avere un backgrund dell'immagine .gif che rispecchi di volta in volta,
durante lo spostamento, il colore ( o piu' tonalita' diverse ) del canvas
sottostante.
Ho provato a dare una proprieta' di " trasparenza " al background dell'
immagine ma non ottengo cio' che desideravo in quanto lo spostamento della
immagine con colore di sfondo trasparente provoca, come risultato dello
spostamento, una scia dovuta al " ridisegnamento " della sfera centrale in
vari punti durante il proprio moto.
E' possibile creare un background ad un'immagine in modo tale che lo stesso
" si colori " delle stesse tonalita' della superficie sottostante ?? quindi
non trasparente, ma effettivamente colorato !! In questo modo presumo che
riusciro' a spostare la mia immagine senza provocare scie di alcun tipo....
( almeno penso :)
GRAZIE STEFANO


Ciao,
se usi una gif trasparente non dovresti avere problemi.
Se ti rimane la scia vuol dire che non stai facendo le cose correttamente.
A occhio e croce quando sposti l'immagine fai solo il repaint dell'area dell' 
immagine e non di tutto l'area in cui l'immagine si muove.
Marco

 ha scritto nel messaggio
news:3f59c8e2$1...@news.swissonline.ch...


Ciao Stefano,
ho fatto una classe di test con una gif trasparente e sfondo non monocromatico e 
non ci sono problemi(con swing, non awt, cmq non cambia molto a livello di codice).
Per muovere l'immagine tieni premuto il tasto sinistro del mouse.
Ora, senza vedere il tuo codice non posso dire di più, se vuoi fai un post che 
ci do un occhiata.
Marco
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import javax.swing.*;
public class Prova extends JFrame {
   public Prova() {
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);	
     setSize(600, 600);
     DrawPanel panel = new DrawPanel(new ImageIcon("c:\\img.gif").getImage());	
     addMouseMotionListener(panel);	
     getContentPane().add(panel);
     setVisible(true);
   }
 
   public static void main(String args[])  {
     new Prova();
   }
   class DrawPanel extends JComponent implements MouseMotionListener {
     Image img = null;
     int x = 0;
     int y = 0;
 
     public DrawPanel(Image img) {
       this.img = img;
     }
 
     private GradientPaint computeGradient(Rectangle2D rectangle) {
       return new GradientPaint((float) rectangle.getX() ,
                                (float) rectangle.getY(),
                                Color.RED,
                                (float) rectangle.getMaxX(),
                                (float) rectangle.getY(),				 
             Color.BLACK);
     }	
 
     public void mouseDragged(MouseEvent e) {
       x = e.getX();
       y = e.getY();
       repaint();
     }
 
     public void mouseMoved(MouseEvent e) {}
 
     public void paintComponent(Graphics g) {
       Graphics2D g2 = (Graphics2D) g;
       g2.setPaint(computeGradient(getVisibleRect()));
       g2.fill(getVisibleRect());
       g.drawImage(img , x, y, null);
     }		
   }
}

 Ora, senza vedere il tuo codice non posso dire di piů, se vuoi fai un post


 
Non c'è trucco :)
Il fatto che ti resta una scia bianca mi intriga. Se non facessi correttamente 
un repaint dello sfondo dovrebbe rimanerti una scia della sfera e non uno sfondo 
bianco.
Con AWT non ci sono problemi, lo puoi fare.
Non so, se riesci cerca di fare un esempio "ridotto" (cioè non fare un post con 
un codice di 1000 righe ;) che riproduce il problema e poi ci diamo un'occhiata 
insieme... ok?
Marco

 ha scritto nel messaggio
news:3f5b989c$1...@news.swissonline.ch...


Se mi dici che razza di classe è Elements(?) lo guardo... ;)
Marco

 
Ha scusa, ho letto ora la descrizione ;)

Bhe, l'errore principale è che hai messo un loop nel paint(). Praticamente il 
paint non esce mai e dunque il frame non avrà mai la possibilità di ridisegnare 
lo sfondo. L'ho riparata alla bell'e'meglio ;)
Ricordati che se vuoi disegnare + volte lo si fa modificando i dati necessari e 
richamando successivamente repaint(), non facendo un ciclo nel paint. Oltretutto 
facendo cosi(mettere un loop) perdi il controllo sull'applicazione perchè 
"rompi" il sistema della spedizione(dispatching) degli eventi(infatti se provi a 
chiudere il frame, nella tua versione, quello non si chiude).
Dovrai poi realizzare a mano il double buffering se usi AWT(con swing è 
automatico) altrimenti potresti vedere una fastidiosa intermittenza 
dell'immagine quando si muove.
Marco
import java.awt.event.*;
import java.awt.*;
class Test extends Frame {
   int x = 50;
   int y = 50;
   Image sphere = Toolkit.getDefaultToolkit().getImage("c:\\img.gif");
 
   public Test() {
     setTitle("Test");
     setBackground(Color.red);
     setSize(900,500);
     setLocation(50,50);
     addWindowListener(new WindowAdapter() {
       public void windowClosing(WindowEvent e) {
         System.exit(0);
       }
     });
   }
 
   public void doPaint() {
     for( int i = 0; i <= 1000; i = i + 1) {
       repaint();
       x ++; y ++;
       try {
         Thread.sleep(100);	
       } catch (Exception e) {}
     }
   }
   public void paint(Graphics g) {
     g.drawImage(sphere, x, y , null);
   }
}
public class Start {
   public static void main(String[] args) {
     Test frame = new Test();
     frame.show();
     frame.doPaint();
   }
}

 ha scritto nel messaggio
news:3f5ce708$1...@news.swissonline.ch...


 proposito .. cos'è ??
http://developer.java.sun.com/developer/technicalArticles/Interviews/DoubleBuffering/d-buffer.txt
Se cerchi nel sito della sun(
java.sun.com
) o nella loro mailing list troverai 
sicuramente tutte le spiegazioni necessarie.
Marco

 ha scritto nel messaggio
news:3f5e03a6$1...@news.swissonline.ch...


 
Come desideri :)
Io la farei cosi.
Marco
import java.awt.*;
import javax.swing.*;
class TestPanel extends JPanel {
   Image img = null;
   int x = 0;
   int y = 0;
   public TestPanel(String filename, int x, int y) {
     img = Toolkit.getDefaultToolkit().getImage(filename);
     setImagePosition(x,y);
   }
   public void paintComponent(Graphics g) {
     super.paintComponent(g);
     g.drawImage(img, x, y , null);
     // hmm, all'interno del paintComponent chiamare doPaint che
     // a sua volta chiama repaint che a sua volta richiama
     // paintComponent non è una buona idea.
     /*
     doPaint();
     */
   }
   // Io farei un metodo pubblico che cambia le coordinate dell'immagine e basta.
   // Il fatto di fare il ciclo o la pausa o il repaint non sono
   // responsabilità di questa classe ma di chi la utilizza.
   /*
   public void doPaint() {
     x = x + 1; y = y + 1;
     repaint();
     try {
       Thread.sleep(5);
     } catch (Exception e) {}
   }
   */
   public void setImagePosition(int x, int y) {
     this.x = x;
     this.y = y;
   }
}
public class Start {
   public static void main(String[] args) {
     TestPanel panel = new TestPanel("c:\\img.gif", 10,10);
     JFrame frame = new JFrame("Test");
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     frame.setBounds(50, 50, 900, 500);
     frame.getContentPane().add(panel);
     frame.show();
 
     for (int i = 11; i < 350; i++) {
       panel.setImagePosition(i, i);
       panel.repaint();


 Io la farei cosi.
Hmm.. ripensandoci ho sbagliato una cosa(anzi due). Chiamare repaint quando 
imposti le coordinate *č* competenza della classe ed inoltre drawImage deve 
avere come ImageObserver il pannello altrimenti se istanzi l'oggetto e 
basta(senza mai chiamare setImagePosition) l'immagine non viene disegnata.
Marco
p.s. questa volta dovrebbe essere a posto, a meno che non mi venga in mente 
altro + tardi ;)
import java.awt.*;
import javax.swing.*;
class TestPanel extends JPanel {
   Image img = null;
   int x = 0;
   int y = 0;
   public TestPanel(String filename, int x, int y) {
     img = Toolkit.getDefaultToolkit().getImage(filename);
     this.x = x;
     this.y = y;
   }
   public void paintComponent( Graphics g ) {
     super.paintComponent(g);
     // cosi alla prima pausa non disegna l'immagine
     // g.drawImage(img, x, y , null);
     // cosi invece si
     g.drawImage(img, x, y , this);
   }
   public void setImagePosition(int x, int y) {
     this.x = x;
     this.y = y;
     repaint();
   }
}
public class Start {
   public static void main(String[] args) {
     TestPanel panel = new TestPanel("c:\\img.gif", 50,50);
     JFrame frame = new JFrame("Test");
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     frame.setBounds(50, 50, 900, 500);
     frame.getContentPane().add(panel);
     frame.show();
 
     try {
       Thread.sleep(1500);
       panel.setImagePosition(100, 400);
       Thread.sleep(1500);
       panel.setImagePosition(400, 100);
       Thread.sleep(1500);		
       for (int i = 0; i < 350; i++) {
         panel.setImagePosition(i, i);
         Thread.sleep(5);
       }
     } catch (Exception e) {}
   }
}