mercoledì 3 marzo 2010

Caricare una immagine dal bundle di una applicazione RCP

Il caricamento di una immagine contenuta in un bundle ma non nell'ImageRepository di una applicazione RCP non è un'operazione così banale come si potrebbe pensare, soprattutto se quello che serve non è tanto l'immagine ma i byte legati ad essa. In questo caso occorre infatti avere la possibilità di aprire uno stream verso l'immagine, e quindi si deve poter recuperare esattamente la posizione dell'immagine su disco.
Il primo passo è quello di ottenere il bundleimg corrente, e da esso ottenere l'URL dell'immagine con percorso assoluto "relativamente" al bundle stesso. In altre parole, se l'immagine si trova nella cartella del bundle, il percorso deve essere reso relativo ovvero deve diventare /img. L'URL così ottenuta è in una forma strana, come ad esempio:
bundleentry://33.fwk43086831/img/logo.png
Questo URL deve essere tradotto in una forma che abbia senso, ovvero in un percorso valido per il file system: questo viene fatto mediante il FileLocator. Ottenuto quindi l'URL effettivo (valido per il file system) dell'immagine, è possibile costruire un File e da esso un FileInputStream per ottenere i byte dell'immagine stessa.

In sostanza il codice risulta come il seguente:

Bundle bundle = Platform.getBundle( your.package.Activator.PLUGIN_ID );
URL url = bundle.getEntry(DEFAULT_LOGO_IMAGE_FILE_NAME);
URL fileURL = FileLocator.toFileURL( url );
File dummyImage = new File( fileURL.getPath() );
InputStream is = new FileInputStream(dummyImage);
byte[] bytes = new byte[ is.available() ];

is.read( bytes );

Nessun commento: