|
Modelul de impingere este implementat in pachetul de clase java.awt si este un model simplu de filtre de producatori si consumatori (producer/consumer) pentru procesarea de imagini. O imagine este reprezentata de un obiect de tip Image si este o abstractizare care nu este manipulata direct, ci mai degraba este folosita pentru a obtine o referinta catre un alt obiect care implementeaza interfata ImageProducer. Obiectele care implementeaza aceasta interfata sunt apoi atasate la obiecte care implementeaza interfata ImageConsumer.
Obiectele filtru implementeaza amandoua interfetele, de producator si consumator si pot sa joace rolul de sursa sau destinatie pentru datele imagine. Datele imagine au asociate un obiect ColorModel care descrie configuratia pixelilor din imagine, precum si modul de interpretare a datelor.
Pentru a procesa imagini folosind modelul de impingere, un obiect Image este obtinut dintr-o sursa oarecare, de exemplu printr-un apel la metoda Applet.getImage(). Metoda Image.getSource() poate apoi fi folosita pentru a obtine ImageProducer-ul pentru acel Image. O serie de obiecte de tip FilteredImageSource pot fi atasate la ImageProducer, fiecare filtru fiind un ImageConsumer a imaginii sursa precedente.
Clasa FilteredImageSource este o implementare a interfetei ImageProducer care preia o imagine si un obiect filtru si le foloseste pentru a produce date imagine continand imaginea filtrata. In fragmentul de cod urmator (Exemplul 1.) se prezinta o filtrare a unei imagini folosind un filtru de convolutie:
Exemplul 1. Utilizarea modelului de impingere pentru realizarea unei operatii de convolutie a unei imagini
Image src = getImage(getDocumentBase(),"floare.gif");
ImageProducer prod = src.getSource();
ImageFilter filter = new BufferedImageFilter(
new ConvolveOp(new Kernel(3,3, new float[] )));
Image img = createImage(new FilteredImageSource
(src.getSource(),filter));Procesarea de imagini in AWT defineste doar cateva filtre simple pentru ajustarea imaginilor si pentru manipulari ale canalelor de culoare.
Destinatia finala a imaginilor filtrate este un obiect Image, care poate fi creat printr-un apel la metoda Component.createImage(). Odata creat consumatorul de imagine, imaginea poate fi desenata pe ecran printr-un apel la metoda Image.getGraphics() pentru a obtine un obiect de tip Graphics, care reprezinta un dispozitiv ecran, urmat de apelul Graphics.drawImage().
Procesarile de imagini din AWT au fost concepute pentru a facilita afisarea de imagini intr-un browser Web. In acest context o imagine poate fi rezidenta undeva in retea si nu se poate garanta ca acea imagine va fi disponibila atunci cand este nevoie, asa ca modelul AWT nu forteaza filtrarea imaginii sau completarea afisarii imaginii, fiind un model in intregime de impingere.
Un ImageConsumer nu poate niciodata sa solicite datele, el trebuie sa astepte dupa ImageProducer pentru a "impinge" datele spre el. In mod similar, un ImageConsumer nu are nici o informatie despre momentul cand datele vor fi trimise in intregime, acesta trebuie sa astepte un apel la metoda ImageComplete() pentru ca sa afle cand are imaginea completa. O aplicatie poate de asemenea instantia un obiect de tip ImageObserver daca doreste sa fie instiintata despre incheierea unei operatii de procesare a imaginilor.
Procesarile de imagini din AWT nu au adoptat ideea unei imagini care este sustinuta prin stocarea ei permanent. Atat timp cat sunt furnizate metodele pentru a converti o arie de memorie de intrare intr-un ImageProducer, sau pentru a captura o arie de memorie dintr-un ImageProducer, nu exista notiunea de obiect imagine persistent care sa poata fi reutilizat. Atunci cand este nevoie de date de la un Image, trebuie sa obtinem o referinta spre ImageProducer-ul imaginii.
Modelul AWT nu poate fi folosit pentru dezvoltarea de cod de procesare a imaginilor foarte performant din cauza modelului de impingere, lipsei unui obiect imagine persistent, modelului restrictionat al unui filtru imagine si a unui numar mic de formate de date imagine. De asemenea lipsesc cateva concepte de baza care sunt des folosite in procesarea de imagini, cum ar fi operatiile executate pe o regiune de interes a unei imagini.
In Tabelul 2. sunt prezentate clasele si interfetele care sunt folosite de modelul de impingere AWT.
Clasa/Interfata
Descriere
Image
Superclasa pentru toate clasele care reprezinta imagini grafice
ColorModel
Clasa abstracta care incapsuleaza metodele pentru translatarea valorii unui pixel spre componentele culorii (ex. , rosu, verde, albastru) si o componenta alfa.
FilteredImageSource
O implementare a interfetei ImageProducer care preia imaginea existenta si un obiect filtru si le utilizeaza pentru a produce date imagine pentru o noua versiune filtrata a imaginii originale
ImageProducer
Interfata pentru obiectele care pot produce date imagine pentru obiecte Image. Fiecare imagine contine un ImageProducer care este folosit pentru reconstructia imaginii oricand este nevoie, de exemplu, atunci cand imaginea este scalata si are alte dimensiuni, sau cand latimea sau inaltimea imaginii este solicitata.
ImageConsumer
Interfata pentru obiectele care isi manifesta interesul asupra datelor imagine prin interfata ImageProducer. Cand este adaugat un consumator la un producator de imagine, producatorul trimite toate datele despre imagine folosind apeluri de metode definite in aceasta interfata.
ImageObserver
Interfata asincrona de actualizare pentru receptionarea de notificari cu privire la informatiile despre un obiect Image, in timp ce imaginea se construieste.
Tabelul 2. Clasele si interfetele modelului de impingere