Visualizzazione delle immagini.


Java Sun

Earthweb
(ex Gamelan)

Jars

Java Boutique

JavaWorld

PIP






  JSem: 6.1

   

Caricare e disegnare un'immagine da un'applet.

Il modo più semplice per caricare e disegnare un'immagine consiste nell'usare il metodo
getImage(getCodeBase(),String S); dove S è una stringa col nome del file dell'immagine (per esempio S = "4col_quad.gif"), e poi il metodo g.drawImage(Image img,int x, int y, ImageObserver obs). La stringa S con il nome dell'immagine può essere data come parametro. I parametri x,y indicano le coordinate dell'angolo superiore sinistro dell'immagine sullo schermo. ImageObserver è un'interfaccia implementata da Component, siccome la classe Applet estende Panel e quindi discende da Component, un'applet implementa ImageObserver, per questo motivo l'istruzione g.drawImage() si presenterà nella forma g.drawImage(img, x, y, this) dove img è l'immagine da disegnare, (x, y) sono le coordinate del suo angolo sinistro superiore e dove this fa riferimento all'applet.

Ovviamente abbiamo importato il pacchetto java.awt.image

Questo modo di procedere presuppone che il file immagine e il file class dell'applet siano nella stessa cartella (altrimenti bisogna modificare l'istruzione getCodeBase()).

Esempio:(l'immagine 4col_quad.gif è 300 pixelsx300 pixels)


import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class Im_1 extends Applet{

Image img;
Color bgcol = new Color(238,238, 238);

public void init(){

setBackground(bgcol);
img = getImage(getCodeBase(),"4col_quad.gif");
	}

public void paint(Graphics g){
g.drawImage(img,5,5,this);
	}
}

Il metodo g.drawImage

Il metodo g.drawImage è stato sovraccaricato in Java 1.1 e quindi si può anche usare:

g.drawImage(Image img, dx1,dy1,dx2,dy2,sx1,sy1,sx2,sy2,ImageObserver obs)

Qui dx1, ..., sy2 sono degli int; d sta per destination, s per source. Più precisamente (dx1,dy1) e (dx2,dy2) sono le coordinate degli angoli opposti (superiore sinistro, inferiore destro) del rettangolo nel quale l'immagine sorgente sarà disegnata sullo schermo; (sx1,sy1) e (sx2,sy2) sono le coordinate degli angoli opposti (superiore sinistro, inferiore destro) dell'immagine sorgente. Questo significa che come immagine sorgente possiamo prendere una porzione della nostra immagine.
Prima di tutto bisogna prendere le misure della nostra immagine, questo si può fare nel modo seguente:
int iw, ih;
....
iw = img.getWidth(this);
ih = img.getHight(this);
....
L'istruzione per disegnare l'immagine intera è:
g.drawImage(img, 0,0,iw,ih,0,0,iw,ih,this);

Riduzione, ingrandimento dell'immagine.


Per ridurre l'immagine basta prendere l'immagine intera come sorgente, e come destinazione un rettangolo più piccolo. Per esempio l'istruzione:
g.drawImage(img,5,5,5+iw/2,5+ih/2,0,0,iw,ih,this);
disegna l'immagine ridotta di metà (con l'angolo sinistro alto in (5,5)). Per ingrandire l'immagine basta aumentare il rettangolo di destinazione.
ATTENZIONE! Nel codice precedente sembrerebbe più naturale prendere le misure dell'immagine nel metodo init piuttosto che in paint, però se spostate le due righe
iw = img.getWidth(this);
ih = img.getHeight(this);
nell'init, non vedrete la vostra immagine sullo schermo! Il problema con le immagini (e i files audio) è che prima di usarle bisogna essere sicuri che siano state completamente caricate.
Questo è uno dei motivi per cui è preferibile caricare le immagini usando un oggetto MediaTracker; questo è ancora più vero (dal punto di vista delle performances) se si devono caricare più immagini (e/o files audio).

Caricare le immagini con MediaTracker:


La sintassi è la seguente:

img = getImage(getCodeBase(),"4col_quad.gif");
	try{
		MediaTracker track = new MediaTracker(this);
		track.addImage(img,0);
		track.waitForID(0);
	}catch(InterruptedException e){};

come si può notare (track.waitForID(0)), l'oggetto MediaTracker aspetta che l'immagine sia completamente caricata; osservare che è lanciata un'eccezione che bisogna catturare.
A questo punto possiamo prendere le misure dell'immagine nel blocco try:

img = getImage(getCodeBase(),"HelloWorld.jpg");
	try{
		MediaTracker track = new MediaTracker(this);
		track.addImage(img,0);
		track.waitForID(0);
		iw = img.getWidth(this);
		ih = img.getHeight(this);
	}catch(InterruptedException e){};

Dopo questa parentesi, torniamo a g.drawImage:

Crop dell'immagine:


Possiamo prendere una porzione dell'immagine (modificando le coordinate s del sorgente) e disegnarla (nelle stesse proporzini o ingrandendola) sullo schermo; per esempio qui si prende la parte inferiore destra dell'immagine e la si riproduce su tutta la superficie dell'immagine (quindi con ingrandimento).


import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class Im_3 extends Applet{


Image img;
Color bgcol = Color.white;
int iw,ih;

public void init(){

setBackground(bgcol);
img = getImage(getCodeBase(),"4col_quad.gif");
	try{
		MediaTracker track = new MediaTracker(this);
		track.addImage(img,0);
		track.waitForID(0);
		iw = img.getWidth(this);
		ih = img.getHeight(this);
	}catch(InterruptedException e){};
	}

public void paint(Graphics g){
iw = img.getWidth(this);
ih = img.getHeight(this);
g.drawImage(img,5,5,5+iw,5+ih,(iw/2)-15,ih/4,iw,ih,this);
	}
}

Simmetrie verticali, orizzontali, centrali.


Il metodo g.drawImage permette di fare altri effetti specie se si lavora con le coordinate del rettangolo di destinazione. Abbiamo due coordinate quindi 4 possibilità:

1) lasciare tutto com'è: g.drawImage(img,0,0,iw,ih,0,0,iw,ih,this);

2) scambiare le x del rettangolo di destinazione: g.drawImage(img,iw,0,0,ih,0,0,iw,ih,this);
Questo produce una simmetria rispetto all'asse verticale.

3) scambiare le y del rettangolo di destinazione: g.drawImage(img, 0,ih,iw,0,0,0,iw,ih,this);
Questo produce una simmetria rispetto all'asse orizzontale.

4) scambiare sia le x che le y del rettangolo di destinazione:
g.drawImage(img,iw,ih,0,0,0,0,iw,ih,this);
Questo produce una simmetria centrale.

Incredibile! Le istruzioni 2), ...,4) non sono eseguite corretamente da InternetExplorer 5 mentre lo sono da Netscape 4.7 (e naturalmente dall'appletviewer); provare per credere!

Vedremo più avanti com'è possibile eseguire questi effetti con InternetExplorer 5 aggiungendo un pò di codice.

Caricare e visualizzare un'immagine da un'applicazione.


Per concludere indichiamo come caricare e visualizzare un'immagine da un'applicazione (il metodo getImage() è un metodo della classe Applet). Per raggiungere il nostro scopo bisogna usare un oggetto della classe Toolkit (la classe Toolkit è la superclass astratta di tutte le implementazioni dell'AWT, vedere la doc).
Esempio di codice:

    
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;


public class App_LoadIm{



public static void main(String[] args){
	
Image img;
Toolkit t;
t =  Toolkit.getDefaultToolkit();
img = t.getImage("4col_quad.gif");
Frame f = new Frame("App_LoadIm");
Panel q = new Panel();
ImPan p = new ImPan(q,img);
	f.addWindowListener(new WindowAdapter(){
		public void windowClosing(WindowEvent e){
			System.exit(0);
		}
	});
f.setSize(300,300);//imposta le dimensioni della finestra
f.add(p);
f.setVisible(true);
	}
}

class ImPan extends Panel{

Panel p;
Image im;

ImPan(Panel p,Image im){
	this.im = im;
}
public void paint(Graphics g){
	g.drawImage(im,0,0,this);
}
} 



 next		content		previous