AdminAdministrator
Postari: 315
|
|
In Java AWT este posibila folosirea imaginilor create extern in format gif sau jpeg. Folosirea imaginilor se realizeaza prin intermediul clasei Image. Aceasta nu este o clasa de componente (nu extinde clasa Component) ci implementeaza obiecte care pot fi desenate pe suprafata unor componente cu metode specifice unui context grafic pentru componenta respectiva (similar modului cum se deseneaza o linie sau un cerc).
Clasa ImageVariabile UndefinedProperty The UndefinedProperty object should be returned whenever a property which was not defined for a particular image is fetched. Constructor Image ()
Metode flush () Flushes all resources being used by this Image object. getGraphics() Gets a graphics object to draw into this image. getHeight(ImageObserver) Gets the actual height of the image. getProperty(String, ImageObserver) Gets a property of the image by name. getSource() Gets the object that produces the pixels for the image. getWidth(ImageObserver) Gets the actual width of the image.
Dupa cum am vazut afisarea unei imagini intr-un context grafic se realizeaza cu metoda drawImage din clasa Graphics. Prototipul acestei functii este :
public abstract boolean drawImage(Image img, int x, int y, ImageObserver observer)
Exemplu - afisarea unei imagini intr-un applet import java.awt.*; import java.applet.*; import java.net.*;
public class TestImage1 extends Applet { Image img; URL adresa; public void init() { try { adresa = new URL("file:/d:/java_app/diverse/clouds.gif" ; } catch (MalformedURLException e) { showStatus(“Eroare URL”); } img = getImage(adresa); } public void paint(Graphics g) { g.drawImage(img, 0, 0, this); } }
In acest exemplu pentru a obtine un obiect de tipul Image s-a folosit metoda java.applet.getImage care primeste drept parametru o adresa URL. Formatul acestei metode este : public Image getImage(URL url) sau public Image getImage(URL url, String name), parametrul url specifica localizarea fisierului in WWW iar name defineste sirul de caractere ce reprezinta numele imaginii: Ex: getImage(getDocumentBase(), “clouds.gif”) (Metoda getDocumentBase() a clasei Applet regaseste obiectul director care contine fisierul executabil al appletului)
In cazul in care dorim sa afisam o imagine in fereastra unei aplicatii independente va trebui sa folosim o alta modalitate de a obtine obiectul de tip imagine. In acest caz se utilizeaza metoda getImage a clasei Toolkit, care are urmatorul format: public abstract Image getImage(String filename) sau public abstract Image getImage(URL url)
Clasa Toolkit si subclasele sale sunt utile pentru obtinerea informatiilor despre monitor, pentru a determina fonturile acceptate de o anumita platforma si a crea elemente de afisaj cum sunt butoanelem imaginile, castele de dialog, etc. Ea ofera fiecarei platforme suport pentru interfata GUI (Graphical User Interface) din Java.
Clasa Toolkit Constructor Toolkit () Metode (selectiv) checkImage (Image, int, int, ImageObserver) Monitorizeaza stadiul(evolutia) unei imagini pe o anumita inaltime si latime a ecranului getColorModel() Determina schema de culoare a ecranului getDefaultToolkit() Returneaza kitul cu instrumente implicit. getFontList() Intoarce lista fonturilor disponibile pe platforma curenta getFontMetrics(Font) Returneaza configuratia metrica a unui anumit font getImage(String) Ofera o imagine din fisierul specificat getImage(URL) Ofera o imagine de la adresa specificata getScreenResolution() Valoarea rezolutiei ecranului in puncte pe inci getScreenSize() Afla dimensiunile ecranului, exprimate in pixeli prepareImage(Image, int, int, ImageObserver) Pregateste afisarea pe ecran a unei imagini, avand lungimea si latimea specificate. sync() Sincronizeaza imaginile grafice curente, astfel incat acestea sa functioneze impreuna. Utila la crearea secventelor animate.
Obtinerea unui obiect de tip imagine dintr-un fisier se realizeaza asadar astfel: Image img img = Toolkit.getDefaultToolkit().getImage(“clouds.gif”) Afisarea imaginilor pe o suprafata grafica se realizeaza, de obicei, prin intermediul unei componente de tip Canvas,
Exemplu - afisarea unei imagini intr-o fereastra import java.awt.*; import java.awt.event.*;
public class TestImage2 { public static void main(String argsst) { ImageCanvas ic; Frame f = new Frame("O imagine" ; ic = new ImageCanvas("clouds.gif", new Dimension(400, 400)); f.add(ic); f.pack(); f.setVisible(true); } } class ImageCanvas extends Canvas { private Dimension imgSize = new Dimension(-1, -1); private transient Image img = null; private Dimension canvasSize = null;
public ImageCanvas(String file, Dimension canvasSize) { img = Toolkit.getDefaultToolkit().getImage(file); this.canvasSize = canvasSize; }
public void paint(Graphics g) { imgSize.width = img.getWidth(this); imgSize.height = img.getHeight(this); int x = (canvasSize.width - imgSize.width) / 2; int y = (canvasSize.height - imgSize.height) / 2; g.drawImage(img, x, y, this); g.drawRect(0, 0 , canvasSize.width-1, canvasSize.height-1); }
public Dimension getMinimumSize() { return canvasSize; } public Dimension getMaximumSize() { return canvasSize; } public Dimension getPreferredSize() { return canvasSize; } public void setSize(Dimension newCanvasSize) { canvasSize = newCanvasSize; } }
In ambele exemple se va observa ca imaginea nu apare completa de la inceput ci este desenata treptat fara interventia programatorului. Acest lucru se intampla deoarece metoda getImage() nu face decat sa declanseze procesul de incarcare a imaginii, dupa care reda imediat controlul apelantului. Acest lucru este util, intrucat procesul de incarcare a unei imagini poate dura mult (ex:atunci cand imaginea este preluata din retea) si nu este de dorit ca in acest interval de timp (pana la incarcarea completa a imaginii) aplicatia sa fie blocata. Ca urmare in metoda paint() va fi desenata numai portiunea de imagine care este disponibila la un moment dat si care poate fi incompleta. De aceea trebuie sa existe un mecanism prin care componenta sa fie redesenata in momentul in care au mai sosit informatii legate de imagine. Acest mecanism este realizat prin intermediul interfetei ImageObserver, implementata de clasa Component si deci si de toate subclasele lui Component. Aceasta interfata specifica obiecte care au inceput sa utilizeze o imagine incompleta si care trebuie anuntate de noile date obtinute in legatura cu imaginea respectiva.
Monitorizarea incarcarii imaginilor - Interfata ImageObserver
Interfata are o singura metoda imageUpdate apelata periodic de firul de executie (creat automat) care se ocupa cu incarcarea imaginii. imageUpdate ( Image img, int flags, int x, int y, int w, int h )
Implementarea implicita consta intr-un apel la repaint() pentru dreptunghiul specificat la apel si care reprezinta zona din imagine pentru care se cunosc noi informatii. Intregul flags furnizeaza informatii despre starea transferului. Aceste informatii pot fi aflate prin intermediul constantelor definite de interfata. Acestea sunt : ABORT Incarcarea imaginii a fost intrerupta, inainte de completarea ei. ALLBITS Imaginea a fost incarcata complet ERROR A aparut o eroare in timpul incarcarii imaginii. FRAMEBITS Totii bitii cadrului curent sunt disponibili HEIGHT Inaltimea imaginii este disponibila PROPERTIES Proprietatile imaginii sunt disponibile SOMEBITS More pixels needed for drawing a scaled variation of the image are available. WIDTH Inaltimea imaginii este disponibila
Prezenta in flags a unui bit de valoare 1 pe pozitia reprezentata de o constanta inseamna ca respectiva conditie este indeplinita. Exemple : (flags & ALLBITS) != 0 imaginea eset completa (flags & ERROR | ABORT ) != 0 a aparut o erorare sau transferul imaginii a fost intrerupt
Metoda imageUpdate poate fi redefinta pentru a personaliza afisarea imaginii. Pentru aceasta implementam clasei ImageCanvas, definita anterior, metoda imageUpdate, care va fi apelata asincron de fiecare data cand sunt disponibili noi pixeli. Exemplu public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { //se deseneaza imaginea numai daca toti bitii sunt disponibili if (( flags & ALLBITS) != 0) { repaint(); }
//daca am toti bitii nu mai sunt necesare noi update-uri return ( (flags & (ALLBITS | ABORT)) == 0); }
|
|