Procesarile de imagini în Java au fost suportate înca de la prima aparitie, prin intermediul pachetelor java.awt si java.awt.image.
Primele versiuni ale Java AWT API au fost constituite dintr-un pachet de clase utile care urmareau afisarea de imagini aflate în Internet, dar fara nici o functie necesara pentru procesarile de imagini mai complexe. Acest pachet permitea generarea de imagini simple prin desenarea de linii si forme. De asemenea se putea citi un numar foarte mic de formate de fisiere de imagine (doar formatele GIF si JPEG), prin intermediul unui obiect de tip Toolkit din pachetul java.awt. Odata citita, imaginea putea fi doar afisata, deoarece nu prea existau operatori pentru procesarea ei.
Java 2D API extinde pachetul de început AWT prin adaugarea unui suport mai ridicat pentru operatii generale de grafica si afisare de imagini. Java 2D a adaugat clase speciale pentru definirea de primitive geometrice, formatarea textelor, definirea fonturilor, spatii de culoare si reprezentare de imagini. Noile clase suporta un set limitat de operatori de procesare de imagini cum ar fi blurr, sharpen, transformari geometrice, îmbunatatire de contrast si binarizare. Extensiile Java 2D au fost adaugate la nucleul Java AWT odata cu lansarea platformei J2SE (Java 2 Standard Edition) versiunea 1.2.
Aplicatiile mai pretentioase au nevoie însa de un API de procesare a imaginilor cu facilitati mult mai dezvoltate. Astfel au fost create de catre diverse companii o serie de API-uri de procesare de imagini care au avut un succes destul de remarcabil, dar nici unul dintre acestea nu au fost universal acceptate deoarece au esuat în a se adresa unui segment specific al domeniului procesarilor de imagini sau nu aveau putere în a îndeplini anumite nevoi. Astfel multe companii au trebuit sa-si elaboreze propria implementare în încercarea de a îndeplinii aceste nevoi.
Experienta acumulata de catre industrie si mediile universitare în crearea unor biblioteci de procesare de imagini, utilitatea acestor biblioteci peste o mare varietate de domenii de aplicabilitate si reactia utilizatorilor la aceste biblioteci a condus la crearea JAI (Java Advanced Imaging) API.
JAI este conceput pentru a suporta procesari de imagini folosind limbajul de programare Java într-un mod cât mai general posibil, adresându-se unui domeniu cât mai larg al aplicatiilor de procesare de imagini. În acelasi timp, JAI prezinta un model de programare simplu care poate fi folosit cu usurinta în aplicatii fara a fi nevoie sa se cunoasca toate fazele din constructia API-ului.
JAI extinde mai departe platforma Java (incluzând Java 2D API) permitând astfel ca procesarile de imagini de mare performanta sa fie încorporate în applet-uri si aplicatii Java. JAI este un set de clase care furnizeaza functionalitati legate de procesarea de imagini dincolo de cele obtinute la Java 2D si Java Foundation Classes, dar fiind în acelasi timp compatibil cu aceste API-uri.
JAI implementeaza un set de resurse de baza în procesarea de imagini care includ lucrul cu sectiuni de imagine, regiuni de interes si executie amânata. JAI ofera de asemenea operatori de baza în procesarea de imagini care includ multi operatori punctuali si spatiali obisnuiti, precum si operatori în domeniul frecventa. JAI încapsuleaza formate de date imagine si invocare de metode distanta printr-un obiect imagine reutilizabil, permitând unui fisier imagine, unui obiect imagine de retea, sau unui flux de date în timp real sa poata fi procesate în mod identic.
JAI este proiectat sa satisfaca cerintele oricarei aplicatii de procesare de imagini, acest API fiind foarte extensibil, permitând ca noi operatii sa fie adaugate.
JAI suporta trei modele de procesare de imagini:
Modelul producer/consumer (producator/consumator) de împingere, care este modelul de baza AWT.
Modelul de mod imediat (Java 2D), care este un model AWT mai avansat.
Model de tip pipeline de tragere, care este un model specific JAI.
Urmatorul tabel (Tabelul 7.1) contureaza câteva trasaturi pentru fiecare dintre aceste modele de procesare a imaginilor.
Modelul de împingere |
Modelul de mod imediat |
Modelul de tragere |
|
Interfete/clase importante |
Image ImageProducer ImageConsumer ImageObserver (JDK 1.0.X, 1.1.X) |
BufferedImage Raster BufferedImageOp RasterOp (Java 2D API) |
RenderableImage RenderableImageOp (Java 2D API) RenderedOp RenderableOp TiledImage (Java Advanced Imaging) |
Avantaje |
Procesare condusa de disponibilitatea imaginii (de exemplu în retea) Imagini procesate incremental |
Interfata de programare mai simpla Modelul cel mai des utilizat |
Stocheaza/proceseaza doar datele necesare Permite evaluarea amânata |
Dezavantaje |
Necesita transferul (dar nu procesarea) imaginilor complete Interfata de programare complexa |
Necesita alocare de memorie a întregii imagini Necesita procesarea de imagini întregi |
Interfata de programare mai complexa Implementare mai complexa |
Tabelul 7.1. Modele de procesare a imaginilor în Java
|