Visita il progetto

Transcript

Visita il progetto
Implementazione di un Sistema per il Browsing di
Immagini in Collezioni Fotografiche Personali
Rosolino Finazzo
Università degli Studi di Palermo
Laurea in Ingegneria Informatica
AA 2007-2008
Relatore Prof. Marco La Cascia
Abstract—L’applicativo realizzato consiste in un sistema per
il browsing di immagini in un album fotografico personale, con
l’aggiunta di un rapido sistema di visualizzazione dei volti delle
persone che popolano l’immagine. Le immagini contenenti i
volti, estratte dalle foto dell’album stesso, sono catalogate in
un archivio di miniature, e associate alla foto di provenienza,
attraverso un file di indicizzazione di tipo CSV 1 . L’applicativo
è stato rilasciato come prodotto RCP, ovvero una Eclipse Rich
Client Application, che fa uso di un set minimale di plug-ins
Eclipse Based.
I. L’ AMBIENTE E CLIPSE RCP
La Piattaforma Eclipse è stata ideata per essere utilizzata
come una piattaforma di sviluppo aperta, di conseguenza, essa
è stata strutturata in modo che i suoi componenti possano
essere usati al fine di costruire degli applicativi per utenti
finali.
Il set minimale di plug-ins che occorrono per costruire una
Rich Client application è comunemente conosciuto come la
Rich Client Platform.
Gli applicativi diversi dagli IDE possono essere costruiti
usando un sottoinsieme delle componenti della piattaforma.
Queste Rich Applications sono ancora realizzate mediante un
modello dinamico basato su plug-in , e l’interfaccia utente è
costruita usando gli stessi toolkits e punti d’estensione.
Il layout e la funzione del workbench2 sono, in questo contesto,
sotto stretto controllo dello sviluppatore di plug-in.
Nel dire che la Rich Client Platform è il set minimale di
plug-in utilizzati per costruire una platform application, con
un’interfaccia utente, si intende che tale applicazione
necessita almeno di due plug-in, org.eclipse.ui e
org.eclipse.core.runtime delle loro dipendenze.
Ad ogni modo le rich client applications possono utilizzare
qualsiasi API ritenuta necessaria per le loro caratteristiche
aggiuntive e possono richiedere l’integrazione di qualsiasi
plug-in al di sopra dello stretto indispensabile.
Tra i vari esempi citiamo l’interfaccia utente per la guida
in linea e il gestore degli aggiornamenti.
1 Comma
2 Col
separated values
termine workbench si vuole intendere l’ambiente di lavoro
II. I L DATABASE DELLE IMMAGINI
Il materiale dato in dotazione, come campione per le prove
di funzionamento, è distribuito in due directory e un file di
testo.
La directory pics contiene l’insieme delle immagini di un
album fotografico. In ognuna delle foto sono ritratti alcuni
soggetti in numero variabile. La directory faces contiene i
volti estratti dalle suddette immagini.I files hanno un nome
il cui prefisso fa riferimento al nome dell’immagine di
provenienza. Il file di indicizzazione, data.txt è un file di tipo
CSV, cioè contiene dei valori separati da virgola, in particolare
il primo valore è il nome di un’immagine contenuta in pics,
i valori successivi sono i nomi delle miniature contenute in
faces inerenti alla foto. Per chiarificare la struttura di un file
di tipo CSV ne viene riportato un esempio.
immagine1.jpg,faccia1.jpg,faccia2.jpg
immagine2.jpg
immagine3.jpg,faccia3.jpg
....
immagineN.jpg, ........
III. L A GUI
L’interfaccia grafica è stata realizzata grazie al framework
RCP dell’ IDE Eclipse, essa consiste di:
• Un Navigatore di immagini
• Un Editor di immagini
• Un pannello contenente le miniature dei volti
A. Pictures Navigator
Il Navigatore di Immagini è un’estensione della classe
Resource Navigator, generalmente impiegata nell’IDE Eclipse
per la gestione delle risorse su file system.
Inizialmente l’utente puó creare un nuovo progetto, o importarne uno giá aperto in precedenza. Naturalmente un progetto
deve essere aperto su una directory contenente il Database
nella struttura di cui si è precedentemente detto; se dovesse
Fig. 2.
Fig. 1.
Image Editor
Pictures Navigator
mancare il file per l’indicizzazione o le directory contenenti
le immagini, verrá sollevata un’eccezione e l’errore verrá
notificato all’utente.
Tramite l’aggiunta di particolari filtri è stato possibile selezionare, in base all’estensione, esclusivamente i file di tipo
immagine tra quelli visualizzabili.
È importante sottolineare che al riavvio dell’applicativo troveremo nel Pictures Navigator, gli stessi progetti presenti
all’ultima chiusura dell’applicativo.
B. Image Editor
L’ Editor di Immagini offre due modalitá di visualizzazione:
Fig. 3.
Image Editor con anteprime
Fig. 4.
Binder Panel
La modalitá di visualizzazione con anteprime 3 consente di
visualizzare la miniatura delle immagini del photo album.
Con un semplice doppio click, su una qualsiasi anteprima, si
ritorna alla modalitá di visualizzazione a tutto schermo.
1) Immagine a tutto schermo
2) Immagini in anteprima
Le operazioni effettuabili su un’immagine a tutto schermo
sono le seguenti:
•
•
•
•
•
Vai alla prossima foto o alla precedente
Rotazione di 90 gradi
Zoom In o Zoom Out
Dimensione a grandezza naturale
Adatta la dimensione alla pagina
Al di sotto dell’immagine troviamo una Status Line che ci
offre informazioni riguardanti la dimensione, la profonditá in
bit, la risoluzione e il nome della foto.
C. Binder Panel
Il pannello di visualizzazione delle facce, è una Eclipse
View, 4 nella quale vengono disposte le miniature di ogni
volto. É possibile stabilire un numero massimo di miniature
da visualizzare, specificando tale numero nel menú Settings,
questo riduce i tempi di caricamento nel caso in cui un numero
elevato di soggetti popola l’immagine.
3 Thumbnails
4 Una Vista è un pannello utilizzato per mostrare proprietá relative ad un
editor attivo
Fig. 5.
La GUI di Face Binder
IV. S ETTINGS
Il pannello Settings, accessibile dal menù file o dall’icona
apposita della toolbar, consente di selezionare il numero
massimo di miniature presenti nel Binder Panel, tale valore è
10 di default.
Quando l’utente seleziona un valore, e applica la modifica,
quest’informazione viene memorizzata in un file data.dat.In
questo modo è possibile ricavare gli stessi settaggi ad ogni
riavvio dell’applicazione.
Il valore 0 indica che nessuna restrizione verrà applicata, e il
numero di immagini visualizzate corrisponderà al numero di
volti associati all’immagine d’origine.
Fig. 7.
Pannello delle dipendenze di ”Face Binder”
stesso; esso è contenuto all’interno del progetto di sviluppo
di un plug-in, o una collezione di plug-ins5 , o di un prodotto
finito come nel caso di un RCP.
In particolare, nel modello Eclipse, un plug-in può essere
correlato con un altro plug-in, per mezzo di una delle due
seguenti relazioni:
1) Dipendenza.
I ruoli in questa relazione sono plug-in dipendente,
e plug-in richiesto. Un plug-in richiesto supporta le
funzionalità di un plug-in dipendente.
2) Estensione.
I ruoli in questa relazione sono plug-in ospite e plug-in
estensore. Un plug-in estensore estende le funzionalità
di un plug-in ospite.
A. Dipendenza
Fig. 6.
L’impostazione del numero di volti visibili
V. I NFRASTRUTTURA DEL PLUG - IN FACE B INDER
Al fine di gestire l’interazione tra i vari plug-in che
compongono la Rich Client Application, Eclipse mette
a disposizione degli sviluppatori, un ambiente per la
dichiarazione dei vari plug-in caricati in runtime. In questo
contesto non dobbiamo vedere l’RCP come prodotto
finito quale è, ma come un plug-in interamente gestito e
implementato dal team di sviluppatori che ne diventano i
legittimi autori.
È interessante notare come alcune caratteristiche di portabilità,
visibilità ed estensibilità, tipiche dello sviluppo di classi in
un linguaggio ad oggetti, diventano problematiche comuni,
ad un livello più alto, nell’approccio dichiarativo adottato
nella realizzazione di un plug-in Eclipse. Questa complessa
infrastruttura, viene rappresentata in un file particolare,
plugin.xml, una sorta di manifesto delle proprietà del plug-in
La dipendenza, cosı̀ come definita nel file plugin.xml è
una direttiva data sia in fase d’esecuzione che in fase di
compilazione. In esecuzione, Eclipse deve far si che il plugin richiesto possa essere disponibile per il plug-in dipendente
quando quest’ultimo viene attivato. In fase di compilazione,
Eclipse viene abilitato a espandere il classpath6 per compilare
il plug-in dipendente, dei files jar di tutti i plug-in necessari
B. Estensione
Un plug-in dichiara punti di estensione, in modo che gli
altri plug-in possano estendere le funzionalità del plug-in
d’origine, in modo del tutto controllato. Questo meccanismo
offre un livello di separazione, in modo che il plug-in d’origine
non debba raccogliere informazioni in merito all’esistenza dei
5 Una
collezione di plug-in prende il nome di feature
Classpath è una variabile che indica alla JVM dove cercare le classi e
i packages definiti dall’utente
6 Il
Fig. 8.
Pannello delle estensioni di ”Face Binder”
plug-in estensivi, al momento della sua costruzione.
I plug-in, dichiarano i punti d’estensione in una sezione del
loro manifesto plugin.xml.
Nel caso dell’applicativo Face Binder, diversi tipi di
estensione sono definiti; ad esempio sono inclusi quei plug-in
necessari alla creazione, gestione e organizzazione di widgets
grafici, come org.eclipse.ui.views, org.eclipse.ui.editors.
L’estensione org.eclipse.ui.actionSets, invece definisce le
actions, ovvero delle classi delegate all’apertura di schermate,
non appena viene registrato l’evento di selezione di un
particolare bottone, o di una voce di menù.
Le estensioni org.eclipse.core.runtime.preferences e
org.eclipse.ui.preferencePages, includono tutti quei packages
di supporto per la creazione delle pagine di preferenza, e per
la gestione dei dati definiti dall’utente.
In ultimo, org.eclipse.core.runtime.products, permette di
delineare tutte quelle scelte, definite in fase di esportazione
del progetto in eseguibile, concernenti l’aspetto finale del
prodotto (icone, schermata d’avvio, nome, versione, About
Page), ma anche a selezionare i plug-in da includere nel
bundle, che il prodotto finale porta con se, e di cui necessita
in tempo d’esecuzione, per l’attivazione di una particolare
funzionalità.
Fig. 9.
Estensione della vista Binder sul manager grafico
sulle estensioni dichiarate, senza caricare i plug-in a cui tali
informazioni si rifericono, riducendo quindi il costo di tempo
e memoria richiesto per un’operazione.
A titolo d’esempio si riporta, la definizione dell’estensione
Binder, grazie alla quale è attiva la vista contenente il pannello omonimo, dedicato alla visualizzazione delle miniature
facciali.
In particolare è presentata una duplice versione di tale
dichiarazione, l’IDE Eclipse infatti consente di intervenire sul
file plugin.xml, sia con un manager grafico, sia modificando
direttamente il file nel formato xml8 .
<e x t e n s i o n
p o i n t =” o r g . e c l i p s e . u i . v i e w s ”>
<view
c l a s s =” i m a g e r e t r i e v e r . F a c e s T h u m b n a i l s ”
i c o n =” i c o n s / b i n d e r 1 6 . png ”
i d =” I m a g e R e t r i e v e r . F a c e T h u m b n a i l s ”
name=” B i n d e r ”>
</ view>
</ e x t e n s i o n>
Listing 1.
Codice xml per l’estensione della vista Binder
VI. D ESIGN E IMPLEMENTAZIONE DELLE CLASSI
Ogni tipo di punto d’estensione, può richiedere diversi
attributi per essere propriamente definito. Tipicamente, l’
attributo ID, ha la stessa forma dell’identificatore di un plugin. L’ID di categoria, offre la possibilità ad ogni estensione, ad
esempio una vista, di identificare univocamente la categoria
che lo contiene
.7 I due attributi ID, della categoria e della vista in se, sono
valori espressi in stringhe di caratteri, mentre l’attributo
icona, specifica il percorso relativo dalla directory del plug-in,
all’immagine associata alla vista.
Quest’approccio consente all’IDE, di caricare le informazioni
7 Una
categoria definisce un gruppo di viste che hanno una certa attinenza
I Java Packages, di riferimento per la comprensione del funzionamento del progetto Face Binder e per una sua eventuale
estensione, sono i seguenti:
• imageretriever
• imageretriever.preferences
• quickimage.editors
Il package imageretriever contiene le classi utilizzate per
la gestione delle viste ImageNavigator e FaceThumbnails,
8 eXtensible
Markup Language
rispettivamente contenenti il Pictures Navigator e il Binder
Panel. Assieme all’implementazione delle widgets sopracitate,
nello stesso package troviamo le classi per il parsing e il
caricamento su strutture dati del file di indicizzazione
”data.txt”.
Inoltre in imageretriever si hanno le classi utili alla gestione
del ciclo di vita del plug-in Face Binder stesso.
Il package imagetretriever.preferences, contiene le classi
per l’attivazione, l’implementazione e l’interfaccia utente
della pagina delle preferenze Face Thumbnails. In ultimo, il
package quickimage.editors offre le API9 per la modifica o
estensione dell’Image Editor.
A. Il package imageretriever
1) Activator: La classe Activator, crea l’oggetto plug-in
in tempo di esecuzione. Il metodi start e stop, determinano
l’inizio e la fine del ciclo di vita del plug-in quando vengono
chiamati.
2) ApplicationWorkbenchAdvisor: Tale classe, è impiegata
per la creazione o configurazione iniziale del Workbench,
lo spazio di lavoro sul quale opera l’RCP. In Face Binder,
il metodo initialize, essendo ridefinito10 , rispetto al metodo
della classe padre, effettua delle operazioni aggiuntive,
come salvare lo stato della preferenze settate e salvare nel
Workbench lo stato generale delle componenti grafiche del
programma.
3) Application: La classe Application controlla gli aspetti
fondamentali dell’esecuzione di una Rich Client Application.
I metodi start() e stop(), istanziano la classe Display che
offre un’interfaccia software tra il set di librerie SWT, che
costituiscono le librerie grafiche di riferimento per lo sviluppo
di Eclipse plug-ins e Rich Client Applications, e il sistema
operativo sottostante.
Inoltre come possiamo notare dal diagramma delle classi di
imageretriever, in start(), viene generata l’istanza principale
di ApplicationWorkbenchAdvisor.
4) ApplicationWorkbenchWindowAdvisor:
Il
metodo
preWindowOpen(), permette di customizzare tutte le
impostazioni relative alla finestra di lavoro per l’applitivo. Ad
esempio possiamo specificarne la dimensione in pixel, abilitare
o disabilitare le barre, e decidere il titolo della finestra. In
dispose(), effettuiamo una chiamata al metodo saveData(),
della classe UserData, che permette di memorizzare tutte
le informazioni relative ai parametri di preferenza inseriti
9 Application
10 Override
Programming Interface
Fig. 10.
Diagramma delle classi del package ”imageretriever”
dall’utente tramite il pannello Settings.
5) ApplicationActionBarAdvisor: Il metodo fillMenuBar(),
consente di aggiungere programmaticamente delle voci di
menù, tale possibilità viene anche offerta dichiarando tali
voci11 , all’interno del file plugin.xml.
6) Perspective: Una prospettiva è un insieme di finestre,
una configurazione visuale dell’Ide, finalizzata ad una
certa attività, ad esempio editing del codice, debugging,
consultazione della guida. La classe Perspective di
Face Binder, accosta le due viste FacesThumbnails e
ImageNavigator, col metodo createinitialLayout().
7) FacesThumbnails: Il sopracitato Binder Panel, non è
altro che una vista generata dalla classe FacesThumbnails.
Come in ogni vista, il metodo createPartControl() viene
ridefinito e, tramite esso, si stabiliscono le componenti grafiche
da disporre all’interno della vista stessa. L’inserimento delle
widgets in una vista, avviene creando un’istanza delle stesse,
e disponendole secondo un preciso layout, che può essere
scelto in base alle esigenze. Come si evince dal diagramma
delle classi, l’accesso ai metodi statici getFacesPath() e
setFacesPath(), consente lo scambio di dati con le classi
delegate alla gestione del Pictures Navigator. Il metodo
showFaces(), è responsabile della generazione dei widgets,
(nel caso specifico Buttons), associate alle miniature dei volti.
Si noti che la classe FacesThumbnails, offre un’interfaccia
alla classe ImageNavigator per il parsing del file data.txt,
implementato in CSVMapping: non appena un’immagine
viene selezionata nel navigatore, quest’ultimo invoca il
metodo showFaces(), quindi viene cercato l’elenco dei
volti da disporre sul Binder Panel; tale elenco può essere
determinato tramite il metodo getRow() della classe
CSVMapping.
8) ImageNavigator: In ImageNavigator, il metodo
responsabile della gestione degli eventi di apertura
files, è denominato handleOpen(), e si tratta di
un metodo protetto, ridefinito dalla classe padre
ResourceNavigator, all’interno del quale viene invocato
il metodo FacesThumbnails.showFaces(), di cui sopra.
all’estensione.
Viene anche mostrata solo la directory pics del progetto
aperto, in modo da evitare che l’utente acceda direttamente
al contenuto di faces.
10) CSVMapping: In tale classe, ci si serve di un
CSVReader, istanziato grazie alla classe omonima, e di
una struttura Hash nella quale allocare i dati prelevati dal
file data.txt. Il metodo in cui tutto questo viene effettuato è
initReader().
11) CSVReader: La classe CSVReader offre semplici
funzionalitá di parsing e lettura di un file CSV, il metodo di
tale classe utilizzato per la scansione delle righe, è il metodo
getNextLine(), che utilizza un Buffered Reader.
12) ExitAction ed AboutAction: Le due actions, permettono
rispettivamente l’uscita dal programma, e la visione di un
About Page, dove vengono visualizzate informazioni
sull’applicativo in esecuzione e sui plug-in caricati.
13) UserData: La classe UserData, consente di riporre e
prelevare i dati da un file data.dat, preservato all’interno del
workbench della Rich Client Application.
I dati inseriti dall’utente, indicano il numero massimo di volti
da mostrare nel Binder Panel, tale informazione è incapsulata
attraverso i metodi getFaceNumber() e setFaceNumber().
Diverse classi fanno accesso in sola lettura a tali informazioni
attraverso UserData, altre si limitano semplicemente ad
effettuare le operazioni di restoreData() e saveData(),
rispettivamente nella fase di attivazione e disattivazione del
plug-in in runtime, con la finalità di mantenere la consistenza
dei dati.
L’unica classe che accede ad UserData, per la modifica
dei dati utente, è la classe FaceThumbnailsPP, cioè la
classe utilizzata per l’inserimento delle impostazioni nella
preference page.
B. Il package imageretriever.preferences
9) ImagePatternFilter: Il metodo select(), ridefinito a
partire dalla classe padre ResourcePatternFilter, è un
metodo delegato, invocato al momento della selezione di file
nel navigatore. Tale metodo permette di filtrare, in base alle
caratteristiche scelte, elementi di tipo file e di tipo risorsa.
Nel caso specifico dell’applicativo Face Binder,vengono
selezionati tutti quei file di tipo immagine, in base
11 Una
voce di menù è detta Action
1) FaceThumbnailsPP: La pagina di preferenza, Face
Thumbnails, consente di specificare il massimo numero di
volti mostrati nel Binder Panel. Il metodo createContents
genera un’istanza di ComboFieldEditor, in questo modo,
l’utente dispone di un menù a cascata per scegliere il valore
appropriato. All’interno del metodo performApply(), viene
effettuato il salvataggio di stato, tramite un’invocazione del
Fig. 11.
Diagramma delle classi del package ”imageretriever.preferences”
metodo setFaceNumber della classe UserData. Il metodo
initField imposta un preference store per questa pagina di
preferenze. Un preference store è un repository utilizzato per
conservare dati persistenti, relativi alle impostazioni del plugin, nel contesto del workbench. Alcune di queste impostazioni
saranno gestite dall’utente, mentre altre, potrebbero essere
impostazioni interne che non sono mai esposte all’utente
finale.
2) ImageRetrieverPreferenceInitializer:
Anche questa
classe effettua una chiamata ad un metodo della classe
UserData; in particolare, in fase di inizializzazione della
pagina di preferenza, viene richiamato il preference store
relativo all’ambiente di lavoro corrente. L’operazione
aggiuntiva consiste nell’impostare un valore definito
dall’utente e ”immagazzinato” nella classe UserData, relativo
al numero di volti da mostrare nel Binder Panel, ed è proprio
tale operazione a richiedere ancora una volta alla classe
UserData.
3) PreferenceConstants: Tale classe viene utilizzata come
contenitore, per l’associazione di particolari costanti alle variabili definite nella pagina di preferenza.
4) SettingsAction: È l’action delegata all’apertura della
pagina di preferenza.
C. Il package quickimage.editors
Fig. 12.
Diagramma delle classi del package ”quickimage.editors”
1) QuickImageEditor: La classe QuickImageEditor,
gestisce le proprietà delle componenti grafiche dell’editor,
fornendo una valida interfaccia di programmazione, nel caso
di eventuali modifiche o estensioni delle sue funzionalità. Dal
momento che la classe è un’estensione di EditorPart, sono
presenti i metodi della classe padre ridefiniti tra questi:
• setFocus(), che viene invocato quando l’editor viene
selezionato
• createPartControls(), che permette di inizializzare le
componenti grafiche dell’editor (pulsanti, image canvas,
status line...)
• dispose(), invocato alla chiusura dell’editor
• isDirty(), invocato se qualsiasi contenuto dell’editor
viene modificato dopo l’ultima operazione di salvataggio.
La reale implementazione della componente EditorPart,
dell’Image Canvas12 e della Status Line, risiede nel package
quickimage.core, al quale la classe QuickImageEditor fa
12 Il
Canvas è una superficie sulla quale disegnare elementi grafici arbitrari
accesso durante l’istanziazione delle componenti principali
dell’editor.
VII. S INCRONIZZAZIONE DI E VENTI
Poichè l’utente può generare eventi grafici di
selezione, apertura, chiusura, e passaggio all’immagine
precedente/successiva, all’interno dell’ Image Editor, tali
modifiche devono essere coerentemente riportate nel Binder
Panel, mostrando di conseguenza, le opportune miniature
facciali associate alla nuova immagine selezionata nell’editor.
La strategia di sviluppo adottata, che permette alle diverse
componenti grafiche di interagire, consiste nel servirsi di
particolari Event Listeners, cioè registratori di eventi, associati
ad ogni pulsante dell’editor.
La struttura utilizzata è una HashMap in essa usiamo la
seguente convenzione per l’accoppiamento chiave-valore:
• La chiave è il nome dell’immagine nel photo album.
• I valori associati sono i nomi dei volti miniaturizzati.
Ecco come entrambe le operazioni di lettura e caricamento
su HashMap, vengono implementate nella funzione
initReader:
p u b l i c s t a t i c v o i d i n i t R e a d e r ( S t r i n g CSVFile )
{
hashMap=new HashMap<S t r i n g , S t r i n g [ ] > ( ) ;
CSVReader r e a d e r ;
try {
r e a d e r =new CSVReader ( new F i l e R e a d e r ( CSVFile ) ) ;
String [] nextLine ;
try {
while ( ( nextLine = r e a d e r . readNext ( ) ) ! = null )
n e x t . a d d S e l e c t i o n L i s t e n e r ( new S e l e c t i o n A d a p t e r ( )
hashMap . p u t ( n e x t L i n e [ 0 ] , n e x t L i n e ) ;
{
}
public void w i d g e t S e l e c t e d ( S e l e c t i o n E v e n t e ){
clickedNext ( e ) ;
catch ( IOException e ) {
}
e . printStackTrace ( ) ;
});
}
Listing 2.
Event listener del pulsante next
Quando l’evento viene raccolto da un listener, il metodo delegato, non fa altro che effettuare operazioni di aggiornamento
concernenti l’Image Editor stesso, ma viene invocato anche
il metodo statico responsabile dell’aggiornamento del Binder
Panel, in questo modo, anche i volti visualizzati vengono
aggiornati, coerentemente alla nuova immagine visualizzata
nell’ Image Editor.
void c l i c k e d N e x t ( S e l e c t i o n E v e n t e ) {
/ / Operazioni di aggiornamento d e l l ’ e d i t o r
FacesThumbnails . showFaces ( getPartName ( ) ) ;
/ / Face B i n d e r P a n e l a g g i o r n a t o
}
Listing 3.
Metodo Delegato clickedNext(SelectionEvent)
catch ( FileNotFoundException e ) {
e . printStackTrace ( ) ;
}
}
Listing 4.
metodo initReader()
Quest’operazione di inizializzazione viene unicamente
effettuata con la creazione/importazione di un progetto.
A fronte del ridotto costo delle successive interrogazioni della
tabella hash, l’utente puó considerare ragionevole il tempo
atteso per le suddette operazioni.
L’operazione di interrogazione, richiamata automaticamente
con l’apertura di un’immagine sull’Image Editor, viene banalmente implementata col metodo
p u b l i c s t a t i c S t r i n g [ ] getRow ( S t r i n g key )
{ r e t u r n ( S t r i n g [ ] ) hashMap . g e t ( key ) ; }
VIII. PARSING DEL FILE CSV
Il file data.txt, indicizza le foto personali associandole alle
miniature dei volti in esse contenuti.
Tale file può anche indicizzare un numero elevato di
immagini (più di 1000), pertanto le operazioni di lettura
ed interrogazione di tale file devono essere effettuate
efficientemente.
A. Allocazione su HashMap del file
Una volta letta la generica riga del file data.txt, si procede
all’allocazione su una struttura dati consona all’operazione di
interrogazione.
Listing 5.
metodo getRow(String)
IX. R EQUISITI ED A RCHITETTURE
L’applicativo Face Binder è stato rilasciato come prodotto
multi-platform grazie al plug-in RCP Delta Pack. Il plugin Delta Pack contiene tutte le risorse specifiche per la
piattaforma di destinazione, ed è utilizzato per esportazioni
cross-platform delle applicazioni RCP. Tra le più famose
piattaforme supportate annoveriamo:
Win32 con architettura x86
MacOS X con architettura x86 e ppc
• Linux con architetture x86,ia64 e ppc
• Solaris con architetture sparc
È richiesta la versione 5.0 di Java Runtime Environment
facilmente scaricabile dal sito ufficiale
•
•
X. S VILUPPI F UTURI
L’applicazione Face Binder può essere estesa dando luogo
a sviluppi futuri; un esempio può essere l’integrazione di un
sistema di ricerca di immagini per contenuto.
L’utente, mediante la stessa GUI accede, infatti, ad una
collezione di miniature o di immagini pertinenti a quella
d’origine, per mezzo di determinati algoritmi di ricerca,
i quali, studiando proprietà salienti delle immagini nel
Database, riescono a trovare, in tempo accettabile, una
similitudine tra una coppia d’immagini o un gruppo di
immagini con quella selezionata.
R EFERENCES
[1] Eric Clayberg, Dan Rubel, Eclipse: Building Commercial-Quality Plugins,, 2rd ed. Addison-Wesley,Professional, March 22,2006.
[2] Jeff McAffer, Jean-Michel Lemieux, Rich Client Platform: Designing,
Coding, and Packaging Java(TM), Addison-Wesley,Professional, October 21, 2005.
[3] Robert Harris, Rob Warner, The Definitive Guide to SWT and JFACE,
Apress, June 21, 2004.

Documenti analoghi

Elaborato Formisano Daniele N46001429

Elaborato Formisano Daniele N46001429 È possibile utilizzare l’espressione nel file plugin.xml per specificare lo scope di attivazione dell’handler, ad esempio una finestra specifica o una parte attiva. L’implementazione ...

Dettagli

Eclipse Platform 3.3 - Università degli Studi di Parma

Eclipse Platform 3.3 - Università degli Studi di Parma utilizzando un manifest file (plugin.xml)  Può racchiudere numerose funzionalità (es. HTML editor) oppure una semplice funzione (es. l’azione per creare un file zip)

Dettagli