Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Extinderea JAI API

Extinderea JAI API


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.


1. Scrierea de noi operatori


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

//inregistreaza un nou OperationDescriptor
MyThresholdDescriptor thDescriptor = new MyThresholdDescriptor();
OperationDescriptor odesc = thDescriptor;
RenderedImageFactory rif = thDescriptor;
String operationName = 'MyThreshold';
String productName = 'medimaging';
OperationRegistry or =
JAI.getDefaultInstance().getOperationRegistry();
or.registerOperationDescriptor(odesc,operationName);
or.registerRIF(operationName,productName,rif);

PlanarImage image; // sursa
// utilizarea operatorului care tocmai a fost inregistrat
// construirea blocului de parametrii
ParameterBlock pb = new ParameterBlock();
pb.addSource(image);
pb.add(55);
pb.add(174);
// aplicarea operatorului
PlanarImage img JAI.create('MyThreshold', pb, renderHints);


O clasa de tipul OperationDescriptor si RenderedImageFactory
si o clasa de tipul OpImage pentru crearea unei
* operatieii threshold modificat.

public class MyThresholdDescriptor extends OperationDescriptorImpl
implements RenderedImageFactory ,
,
,
,

,
,

};

* Numele parametrilor pentru operatia "MyThreshold"
*/
private static final String[] paramNames = ;              

* Tipurile de clase pentru parametrii.
*/
private static final Class[] paramClasses = ;              

* Parametrii impliciti

private static final Object[] paramDefaults = ;
/** Constructorul. */
public MyThresholdDescriptor()

* creeaza un MyThresholdOpImage cu ParameterBlock dat daca
* MyThresholdOpImage accepta acest ParameterBlock.

public RenderedImage create(ParameterBlock paramBlock,
RenderingHints renderHints)
return new MyThresholdOpImage(paramBlock.getRenderedSource(0),
new ImageLayout(),
(Integer)paramBlock.getObjectParameter(0),
(Integer)paramBlock.getObjectParameter(1));


verifica daca toti parametrii din ParameterBlock au
tipul corect inainte de construirea MyThresholdOpImage

public boolean validateParameters(ParameterBlock paramBlock)
if (!(arg instanceof Integer))
}
return true;



* MyThresholdOpImage este o extensie a PointOpImage care preia
* doi parametri intregi si o sursa si executa threshold asupra sursei

class MyThresholdOpImage extends PointOpImage

* Executa o operatie threshold modificata asupra pixelilor in
* suprafata dreptunghiulara data. Valorile esantioanelor sub o
* limita inferioara sunt limitate la 0, in timp ce acele peste o limita
* superioara sunt limitate la 255. Rezultatele sunt returnate in
* WritableRaster ca destinatie.

protected void computeRect(Raster[] sources,
WritableRaster dest,
Rectangle destRect)
if (dstAccessor.isDataCopy())


* Calculeaza o arie dintr-un Raster tip byte folosind o sursa
* RasterAccessor si o destinatie RasterAccesor.

private void byteLoop(RasterAccessor src, RasterAccessor dst) else if (pixel > param2) else
srcPixelOffset += srcPixelStride;
dstPixelOffset += dstPixelStride;
}
srcScanlineOffset += srcScanlineStride;
dstScanlineOffset += dstScanlineStride;
}



* Calculeaza o arie dintr-un Raster de tip int folosind o sursa
* RasterAccessor si o destinatie RasterAccesor.

private void intLoop(RasterAccessor src, RasterAccessor dst) else if (pixel > param2) else
srcPixelOffset += srcPixelStride;
dstPixelOffset += dstPixelStride;
}
srcScanlineOffset += srcScanlineStride;
dstScanlineOffset += dstScanlineStride;
}




2. Scrierea de noi decodoare si codoare de imagini


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.


5. Bibliografie

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