|
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 metodogetImage(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)
Il metodo g.drawImageIl 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).
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:
|
next content previous