|
Procesarea client-server asigura abilitatea de calcul distribuit intre un set de noduri de procesare. De exemplu, este posibil sa se construiasca un server puternic care furnizeaza servicii de procesare a imaginilor catre mai multi clienti care nu poseda putere de calcul prea mare. Cu JAI , este posibil pentru un client sa construiasca un lant de procesare a imaginilor complex, incluzand referinte la imagini sursa care se afla pe alte calculatoare din retea si sa ceara o reprezentare de iesire de la server.
JAI utilizeaza Java Remote Method Invocation (RMI) pentru a implementa procesarea de imagini client-server. Pentru a comunica folosind RMI, clientul si serverul trebuie sa ruleze Java. Un obiect stub este instantiat la client. Acest obiect transmite apelurile la metode la un obiect server corespunzator. Argumentele apelurilor la metode si valorile returnate sunt transmise intre client si server prin mijloacele oferite de Java Development Environment si anume posibilitatea de serializare a obiectelor.
Calculatorul gazda si portul depind de configurarile locale. Calculatorul gazda trebuie sa ruleze un proces RMI registry si sa aiba un obiect RemoteImageServer care asculta portul dorit.
Un apel va duce la crearea pe partea de server a unui obiect de tip RMIImageImpl si la partea de client a unui obiect stub. Obiectul client stub serializeaza argumentele metodelor sale si le transfera la sever peste un socket, serverul serializeaza valorile returnate si le trimite la client in acelasi mod.
Constructorul clasei RemoteImage necesita un parametru serverName care reprezinta un nume de calculator gazda si un numar de port, in formatul urmator:
host:port
De exemplu:
hfovi.go.to:1099
Numarul portului este optional si trebuie sa fie furnizat doar daca numele calculatorului gazda a fost furnizat. Daca parametrul serverName este null, in mod implicit se va cauta serviciul RMIImage de pe calculatorul local de la portul rmiregistry (implicit 1099).
O eroare in retea sau o intarziere cauzata de serverul care esueaza in a raspunde la o cerere de imagine este tratata prin reincercari. Daca la prima incercare, serverul nu raspunde, programul v-a astepta un anumit timp specificat si apoi va face o noua cerere pentru imagine. Atunci cand limita reincercarilor este depasita, este returnat un Raster null.
Timpul de asteptare dintre reincercari este in mod implicit de 1 secunda. Metoda getTimeout din RemoteImage este folosita pentru a obtine timpul dintre reincercari, in milisecunde. Metoda setTimeout este utilizata la stabilirea timpului dintre reincercari.
Numarul de reincercari pe care programul le v-a executa in incercarea de a citi imaginea distanta poate fi citit cu metoda getNumRetries. Metoda setNumRetries este utilizata pentru stabilirea numarului maxim de reincercari.
Aceasta sectiune contine doua programe de procesare a imaginilor la distanta.
Exemplul 22. ilustreaza codul complet al unui exemplu de utilizare a clasei RemoteImage. Acest exemplu afiseaza o grila 2x2 de obiecte ScrollingImagePanel, cu fiecare fereastra afisand suma a doua imagini de tip byte care au fost rescalate in limitele [0, 127] inainte de a fi adunate. Panourile afiseaza urmatoarele rezultate:
Sus stanga: reprezentare locala
Sus dreapta: rezultatul procesarii la distanta a grafului RenderedOp
Jos stanga: rezultatele incarcarii la distanta a RenderedImage
Jos dreapta: rezultatele procesarii distante a grafului RenderableOp
Imaginea din partea de jos-dreapta este o versiune cu efect de vibratie (dithered) a imaginii suma transmisa printr-un lookup table cub de culoare si poate sa apara in mod diferit de celelalte trei imagini, care ar trebui sa arate identic.
Exemplul 22. Program de procesare la distanta a imaginilor
Urmatorul exemplu (Exemplul 23.) reprezinta un lant Remote-Imaging raspandit dealungul a doua noduri distante si afiseaza rezultatele local.
Exemplul 23. Lant de tipul RemoteImage
Pentru a executa o procesare de imagini distanta utilizand JAI, trebuie parcurse urmatoarele etape:
1. Crearea unui fisier care specifica tipul de securitate (security policy file).
2. Pornirea registrilor RMI
3. Pornirea serverului de procesare a imaginilor distant
4. Rularea aplicatiei locale
Acesti patru pasi sunt explicati in detaliu in cele ce urmeaza.
Pas 1: Crearea unui security policy file. Implementarea implicita pentru RMI security policy este specificata in unul sau mai multe fisiere de configurare a securitatii. Aceste fisiere de configurare specifica permisiunile care sunt asociate codului din diferite surse. Exista un fisier general implicit security policy file si un singur fisier utilizator policy file.
Fisierul policy este situat in directorul de baza unde JAI este instalat. Daca JAI este directorul de baza unde JAI este instalat, se poate crea (din motive de securitate este de preferat sa fie doar pentru testare) cu ajutorul unui editor text un fisier numit $JAI/policy care contine urmatoarele:
grant ;
Pas 2: Pornirea registrilor RMI. RMI registry este un server de nume simplu care permite clientilor distanti sa primeasca o referinta la un obiect distant. In mod obisnuit, registrul este utilizat doar pentru localizarea primului obiect distant de care o aplicatie are nevoie pentru a conlucra. Apoi acel obiect in schimb furnizeaza suport specific aplicatiei pentru gasirea altor obiecte.
Pentru pornirea registrilor pe server, trebuie intai efectuata operatia de autentificare la sistemul distant unde serverul de procesare a imaginilor v-a rula si executa comanda rmiregistry.
Pas 3: Pornirea serverului de procesare a imaginilor distant. Dupa efectuarea operatiei de autentificare la serverul distant, se porneste severul de procesare a imaginilor distant. De exemplu:
$ CLASSPATH=$JAI/lib/jai.jar:
$JAI/lib/mlibwrapper_jai.jar
$ export CLASSPATH
$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAI/lib
$ export LD_LIBRARY_PATH
$ java
-Djava.rmi.server.codebase=
file:$JAI/lib/jai.jar
-Djava.rmi.server.useCodebaseOnly=false
-Djava.security.policy=file:$JAI/policy
com.sun.media.jai.rmi.RMIImageImpl
Cand pasii de mai sus sunt executati pe o masina cu adresa IP 193.226.6.174 se afiseaza urmatoarele:
Server: using host 193.226.6.174 port 1099
Registering image server as
'rmi://193.226.6.174:1099/RemoteImageServer'.
Server: Bound RemoteImageServer into the registry.
Pas 4: Rularea aplicatiei locale. Dupa efectuarea pasilor 1 la 3, aplicatia locala poate fi pornita. Atunci cand se ruleaza aplicatia locala, trebuie ca parametrul serverName pentru orice constructor RemoteImage sa corespunda masinii pe care ruleaza serverul de procesare a imaginilor distant. De exemplu, daca avem masina cu adresa de IP 193.226.6.174, denumita myserver, atunci parametrul serverName al oricarui constructor RemoteImage trebuie sa fie myserver
Internet Imaging Protocol (IIP) este un standard utilizat in procesarile de imagini client/server. Exista doua operatii JAI care suporta operatii IIP. Aceste doua operatii separate furnizeaza suport pentru partea client a IIP. Aceste operatii, IIP si IIPResolution, solicita o imagine de pe un server IIP apoi creeaza un obiect RenderedImage sau RenderableImage.
Operatia IIP. Aceasta operatie furnizeaza suport pentru partea client a IIP in modurile Rendered si Renderable. Aceasta creeaza un obiect RenderedImage sau RenderableImage bazandu-se pe datele receptionate de la serverul IIP si optional aplica o secventa de operatii asupra imaginii create.
Operatiile suportate sunt urmatoarele:
Filtrare (blur si sharpen)
Corectie de tonalitate si culoare ("color twist")
Modificare de contrast
Selectare a unei surse de interes dreptunghiulare
Orientare spatiala (transformare prin alocare independenta de reprezentare)
Selectarea unei destinatii de interes dreptunghiulare
Transformare de reprezentare (doar in mod Renderable)
Transpunere (rotire si/sau oglindire)
Dupa cum se observa, transformarea de reprezentare este executata doar in modul de procesare Renderable. Aceasta transformare este derivata dintr-un obiect AffineTransform furnizat in RenderContext atunci cand reprezentarea se produce. Modul de procesare Rendered creeaza un obiect RenderedImage care este reprezentarea implicita a obiectului RenderableImage creat in modul de procesare Renderable.
Exemplul 24. reprezinta o operatie IIP.
Exemplul 24. Operatie IIP
Operatia IIPResolution. Aceasta operatie furnizeaza suport pentru partea client a IIP in modul de procesare Rendered. Aceasta operatie este cu specific legat de rezolutie, necesitand de la serverul IIP o imagine la un nivel de rezolutie particular si creeaza un obiect RenderedImage bazandu-se pe datele receptionate de la server. Odata ce este creat acest obiect RenderedImage, nivelul de rezolutie nu poate fi schimbat.
Exemplul 25. prezinta codul pentru o operatie IIPResolution.
Exemplul 25. Aplicarea operatiei IIPResolution