Sei sulla pagina 1di 12

Immagini in Java

BufferedImage Raster SampleModel DataBuffer

ColorModel

ColorSpace

Bande e pixel

BufferedImage: immagine gestita completamente in RAM Raster: gestione dei dati che formano l'immagine:

DataBuffer: contiene effettivamente i dati SampleModel: consente di interpretare il data buffer come un insieme di pixel (quale tipo di dato contenuto nel buffer, quali sono le dimensioni dell'immagine, quante bande sono presenti)

ColorModel: consente di associare al valore di un pixel un colore ColorSpace: rappresenta il modo di esprimere un colore (RGB, HSB, ...), l'origine e gamma di tali assi (esistono diversi RGB per diversi sistemi operativi e per diversi dispositivi)

Termini

Data element: tipo primitivo usato per la gestione del dato che compone l'immagine ( il tipo contenuto nell'array contenuto nel data buffer). Il layout di questi elementi distinto da quello usato per l'interpretazione dell'immagine per pixel. Sample (campione): membri che compongono i pixel di una immagine (ad esempio in una RGB si hanno tre sample) Components: valori dei pixel indipendentemente dal loro colore. Banda: l'insieme di tutti i sample di uno stesso tipo nell'immagine (ad esempio, l'insieme di tutti i valori di rosso nella stessa immagine). Un formato a bande salva ogni banda come un array distinto, un formato pixel interleaved invece salva tutta l'immagine in un solo array, e i sample di uno stesso pixel sono disposti in fila.
... R G B R G B R G B ...

Esempio BIMetadataPrinter

L'esempio dimostra come si possano avere diverse strutture per gestire i dati e i colori, con diverse occupazioni di spazio in memoria. Non tutte le buffered image sono accelerate allo stesso modo: sono pi veloci le buffered image che fanno uso di tipi interi senza segno e che usano il component o l'index color model (ricevono una accelerazione grafica nativa, mentre i restanti sono gestiti in bytecode)

Classi gestione immagini

Limiti delle immagini standard

Devono essere gestite completamente in memoria Non possibile gestire dati floating point Non presente il concetto di dato nullo

Inadeguate all'uso in un GIS!

JAI

Java Advanced Imaging Estensione alle normali immagini pensata per:


Gestione di immagini di grandi dimensioni (tiling) Calcolo: molti gli operatori di analisi e trasformazione gi realizzati, anche in versione ottimizzata per set di istruzioni estesi (MMX, ...)

Supporto ai dati floating point (singola e doppia precisione) Supporto a dati a tre dimensioni Numerosi codec aggiunti, ora forniti nella libreria (separata) JAI Image I/O Ambiti operativi classici: immagini telerilevate (NASA) e biomedicale (TAC e simili) La modalit operativa di Java2D viene detta immediate mode. La modalit operativa di JAI viene detta pull mode, poich le tile sono lette o calcolate soltanto quando richiesto.

JAI

Ci concentreremo soltanto sul rendered mode, ovvero su immagini a risoluzione predeterminata. Ogni operatore prende in ingresso una o pi immagini e un insieme di parametri, e produce una immagine. Gli operatori possono essere messi in cascata e produrre un grafo di operazioni. Le operazioni non vengono svolte fino a che non viene richiesta effettivamente una tile per la visualizzazione o il salvataggio. Le tile vengono calcolate una alla volta, i risultati del calcolo (finali e intermedi) vengono posti in una cache per evitare di doverli calcolare nuovamente.

Tile cache

La cache utile per la visualizzazione e quando il grafo presenta dei bivi, ma pu essere dannosa per grafi lineari e programmi che si comportano come filtri.

JAI

Le interfacce RenderedImage e PlanarImage offrono il supporto per le tile. Ogni tile un Raster separato, ma avente lo stesso SampleModel, mentre il ColorModel gestito direttamente dalla RenderedImage. Se si invoca la getRaster direttamente l'immagine obbligata a ricostruire un databuffer piano caricando quindi tutta l'immagine in memoria. Invocando la getTile invece si carica l'immagine una mattonella alla volta.
RenderedImage ColorModel SampleModel Raster DataBuffer Raster DataBuffer Raster DataBuffer

JAI accedere a immagini con tiling

Accedere medinate le tile pu essere macchinoso Esistono degli iteratori che consentono di mascherare la struttura a tile senza per questo caricare tutto in RAM. Il RandomIter consente di leggere qualunque pixel in qualunque ordine ma in genere meno efficiente.

RectIter

RookIter

Creare una nuova operazione

Occorre definire una


Sottoclasse di OpImage che contiene il codice di calcolo Sottoclasse di OperationDescriptor che contiene la descrizione dell'operazione e l'elenco pubblico di parametri Sottoclasse di RenderedImageFactory che crea la RenderedImage risultato del calcolo

Di fatto:

Si crea una sottoclasse di OperationDescriptorImpl e si implementa in questa anche l'interfaccia RenderedImageFactory Si crea una sottoclasse di PointOpImage, AreaOpImage, GeometryOpImage o StatisticOpImage a seconda delle necessit di calcolo Si registra la nuova operazione presso la JAI in modo da poterla usare come una delle operazioni built-in

Si veda il codice di esempio.

GridCoverage

GridCoverage

Geofisica: la rappresentazione reale del dato, pu essere composta di numeri interi o floating point. Se floatin point, alcuni valori possono essere qualitativi (temperatura del mare, in cui inserisco le qualitative nuvola e terra, mappate su due distinti valori NaN): in questo caso il SampleModel ha pi di una category. Non geofisica: il mapping della rappresentazione reale su un insieme di valori unsigned byte o unsigned short con le trasformazioni contenute nelle Category. Sono usate per la visualizzazione (perch possibile usare un index color mode, pi veloce) e per il salvataggio compresso, poich tali grid possono essere salvata mediante una compressione PNG (ad esempio). Se non si fa uso del salvataggio compresso viene usata la forma geofisica per il salvataggio (vedi ad esempio ArcGrid). Geofisica Non geofisica

GridCoverage PlanarImage

GridCoverage PlanarImage