|
Desi nici un API de procesare a imaginilor nu spera sa captureze enorma varietate de operatii care se pot executa asupra imaginilor digitale, JAI API suporta un numar foarte mare de operatii, fiind conceput de la inceput ca sa incurajeze programatorii sa scrie extensii decat sa manipuleze datele imagine in mod direct. JAI permite in mod virtual ca orice algoritm de procesare a imaginilor sa fie adaugat la API si sa fie folosit ca si cum ar fi fost o parte nativa a acestuia.
Mecanismul pentru adaugarea diverselor functionalitati la API pate fi prezentat la mai multe nivele de incapsulare si complexitate. Aceasta permite programatorilor care doresc sa adauge operatii simple la API sa se confrunte cu concepte simple, in timp ce extensiile mai complexe au un control total asupra mediului lor la cel mai jos nivel de abstractizare.
JAI API suporta o mare varietate de stiluri de programare, care include modul de executie imediat si amanat pentru tipuri diferite de aplicatii de procesare a imaginilor.
Toate extensiile la JAI necesita adaugarea de noi clase. Toate clasele trebuie grupate in pachete ca mod de organizare eficient si pentru separare a acestora de pachetele oferite de altii.
Pentru a extinde JAI API prin crearea de noi operatii, este nevoie sa scriem o noua subclasa a OpImage. Aceasta se poate face prin subclasarea a uneia sau mai multe clase utilitare pentru a automatiza unele dintre detaliile a operatorului pe care dorim sa-l implementam.
Odata creati, noii operatori pot fi facuti disponibili pentru utilizatori in mod transparent si fara modificarea codului sursa de la utilizator, folosind mecanismul de registrii JAI.
Pentru a crea un nou operator, trebuie create urmatoarele clase:
O clasa care extinde clasa OpImage sau oricare dintre subclasele acesteia. Aceasta noua clasa este cea care executa procesarea.
O clasa care extinde clasa OperationDescriptor. Aceasta noua clasa descrie operatia prin nume, lista de parametrii, etc.
O clasa care implementeaza java.awt.image.renderable.Rendered-ImageFactory, daca operatorul va functiona doar in modul Rendered.
Operatiile care sunt create folosind una dintre metodele JAI.create trebuie definite in registryFile, care este inclus in arhiva jai core.jar. Fiecare operatie are asociat un obiect OperationDesciptor (marcata prin "odesc" in registryFile), care furnizeaza o descriere textuala a operatiei si specifica numarul si tipul sursei precum si parametrii. Acest descriptor specifica de asemenea daca operatia suporta modul Rendered, sau Renderable, sau amandoua.
Toate numele de operatii de nivel inalt (de exemplu, Rotate, Convolve si AddConst) sunt mapate la instante de tipul RenderedImageFactory (RIF) si/sau ContextualRenderedImageFactory (CRIF) care sunt capabile de instantierea de lanturi OpImage pentru executia operatiei specificate. Obiectele RIF sunt utilizate pentru operatii in modul Rendered, iar obiectele CRIF sunt utilizate pentru operatii in modul Renderable sau in modurile Rendered si Renderable.
Pentru evitarea problemelor asociate cu editarea directa a registryFile si reimpachetarea lui, se pot inregistra obiectele OperationDescriptor, RIF si CRIF utilizand metodele registerOperationDescription, registerRIF si registerCRIF din clasa OperationRegistry. Singurul dezavantaj al acestei metode de inregistrare este faptul ca noul operator nu va fi in mod automat reincarcat de fiecare data cand un program JAI este executat, deoarece operatia nu este inregistrata in registryFile. Noua operatie va trebui inregistrata de fiecare data inainte de a putea fi folosita.
Pentru a inregistra temporar o noua operatie trebuie parcursi urmatorii pasi:
1. Inregistrarea numelui operatiei
Numele operatiei la nivel inalt, denumit si operation descriptor (descriptor de operatie), este inregistrat printr-un apel la metoda registerOperationByName sau la metoda registerOperationDescriptor. Numele descriptorului de operatie trebuie sa fie unic.
Odata ce un descriptor de operatie este inregistrat, acestea pot fi obtinute prin nume prin apelul metodei getOperationDescriptor.
2. Inregistrarea setului de obiecte RIF
Obiectele RIF sunt inregistrate folosind metoda registerRIF. Fiecare RIF este inregistrat cu un nume de operatie specific. Exista de asemenea metode similare pentru inregistrarea obiectelor CRIF.
Exemplul
32. prezinta cateva fragmente dintr-un program in
care se inregistreaza temporar o noua operatie. Dupa
inregistrarea operatiei MyThreshold se aplica aceasta
operatie asupra unei imagini Rendered. In exemplu se prezinta
si codul sursa al claselor care descriu operatia.
Exemplul 32. Inregistrarea si utilizarea unei noi operatii JAI
Pentru a crea un decodor si un codor pentru un anumit format specific este nevoie de crearea a trei clase:
O clasa de tipul ImageCodec pentru controlul fisierelor imagine in formatul pentru care se doreste codorul.
O clasa de tipul ImageDecoder necesara pentru citirea fisierelor imagine in formatul pentru care se doreste decodorul
O clasa de tipul ImageEncoder necesara pentru scrierea fisierelor imagine in formatul pentru care se doreste codorul.
Clasele de codoare care acompaniaza pachetele JAI API sunt furnizate programatorului doar ca suport convenabil pentru lucrul cu fisiere imagine. Aceste clase nu fac parte in mod oficial din JAI API, functionalitatile oferite de aceste clase sunt implementate in Java Image I/O API, care este disponibil in J2SE incepand cu versiunea 1.4. Cu toate acestea, clasele pentru lucrul cu fisiere imagine din JAI sunt inca disponibile in continuare, dar este posibil ca ele sa fie eliminate in urmatoarele editii JAI. Aplicatiile care utilizeaza operatii I/O cu imagini este de preferat sa lucreze cu Java Image I/O API.
Clasa ImageCodec permite crearea de codoare si decodoare de imagini. Instantele clasei ImageCodec pot fi inregistrate prin nume. Metoda registerCodec asociaza un obiect ImageCodec cu un nume dat. Orice codor care a fost inainte asociat cu acel nume este eliminat. Odata ce un codor este inregistrat, numele asociat cu acesta poate fi folosit ca parametru name in metodele createImageEncoder si createImageDecoder.
Clasa ImageCodec mentine un registru cu obiecte FormatRecognizer care examineaza un InputStream si determina daca acesta adera la un format controlat de un ImageCodec particular. Un FormatRecognizer este adaugat la registrii cu metoda registerFormatRecognizer.
Metoda getCodec returneaza obiectul ImageCodec asociat cu un nume dat. Daca nu este inregistrat nici un codor cu acel nume, se returneaza null.
1. "Programming in Java Advanced Imaging", Sun Microsystems, http://java.sun.com/products/java-media/jai, November 1999
2. "The JAI Tutorial", Sun Microsystems, http://java.sun.com/products-/java-media/jai, 1999
3. "Programmer's Guide to the Java 2D API", Sun Microsystems, http://java.sun.com, 1999
4. The Java Tutorial Sun Microsystems, http://java.sun.com, 2001
5. "JAI Documentation, v1.1", Sun Microsystems, http://java.sun.com/ products/java-media/jai, 2001
6. Java 2 SDK, Standard Edition Documentation, v1.4.0 Sun Microsystems, http://java.sun.com, 2001