2015-08-19 11 views
7

Ho letto gli strumenti di sviluppo OS X Java, al fine di rendere la mia applicazione più "nativa" con il sistema operativo. Ho trovato qualcosa di interessante in questo particolare section. (Sottolineatura mia)In che modo Java carica NSImages nativi?

Per caricare un tiff, ICNS, o pdf di file indipendente dalla risoluzione dalla cartella Risorse del proprio bundle dell'applicazione nella vostra applicazione Java, utilizzare il metodo di java.awt.ToolkitgetImage(). La stringa passata in getImage() ha il formato "NSImage://MyImage". Non includere l'estensione del file dell'immagine. Tenere presente inoltre che il renderer 2D di Sun è disabilitato quando il fattore di scala dell'interfaccia utente non ha un valore di 1.0. Usa il renderer Quartz in modo che le tue immagini si adattino senza intoppi.

Conoscere javax.imageio, questo si presenta come una completa sorpresa, come non avevo conosciuto nessun altro modo per caricare altri tipi di file in immagini. Soprattutto con una piattaforma obsoleta e assolutamente nessun supporto per file come .tiff. Ad esempio, un test rapido sul mio computer mi dà questo:

Supported read formats: [jpg, bmp, gif, png, wbmp, jpeg] 
Supported write formats: [jpg, bmp, gif, png, wbmp, jpeg] 
'JPEG' reader: [email protected] 
'JPEG' reader: [email protected] 

ho cercato di caricare un'immagine semplice .tiff e testato questo fuori:

 
static Image n; 

public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    JPanel p = new JPanel() { 
     @Override 
     public void paintComponent(Graphics graphics) { 
      graphics.drawImage(n, 0, 0, null); 
     } 
    } 
    f.add(p); 
    n = Toolkit.getDefaultToolkit().getImage(("/Users/zinedine/Desktop/test_image.tiff"); 
    f.setVisible(true) 
} 

Produce nulla:

enter image description here

Ho provato di nuovo: questa volta, aggiungendo l'immagine nella cartella di base del mio progetto java e digitandola come una stringa: "NSImage://test_image.tiff". Come tutto ciò che faccio, non funziona.

Tuttavia, se cambio la mia stringa di percorso di fantasia per un NSImage uno, come ad esempio "NSImage://NSApplicationIcon" ...

enter image description here

Funziona. Ho fatto una rapida ricerca di Spotlight per NSImage e ne ho trovato uno. Sembra che il tipo di file per queste immagini sia .png. Questo è un po 'inquietante, dal momento che mi aspettavo che uscisse un'immagine corretta. Intendiamoci, me lo aspettavo anche io: se si aspetta argomenti del modulo "NSImage://something", allora potrebbe semplicemente ignorare qualsiasi altra cosa.

Ovviamente, ho un paio di domande:

  • Come funziona il Toolkit caricare l'immagine? Se provo a caricare un'immagine .tiff dal mio desktop, questo è ciò che ottengo se chiamo .toString():

    [email protected] // Also can't be cast to java.awt.BufferedImage 
    
  • Sono i lettori (e gli scrittori se presenti) parte di un'API pubblica? In altre parole, posso chiamare qualcosa per caricare il mio file .tiff in un Image (che posso poi gettato in un `BufferedImage?

  • E poi di nuovo, se i lettori/scrittori sono parte della API, perché doesn' il pacchetto javax.imageio li individua?

Questo può apparire come un pugno, (sì mi dispiace per aver rovinato la giornata su questa questione), ma a me, questo appare come previsto, ma allo stesso comportamento erroneo tempo. Segni di bonus: Esiste una API di immagini amichevole (cioè Open Source) (non la JAI) in grado di elaborare i file .tiff (e altri)?

risposta

1

Stai facendo più domande qui, ma farò del mio meglio nell'interpretazione di tutto. :-)

L'utilizzo del Toolkit per caricare immagini (java.awt.Image e amici) fa parte della "vecchia" API asincrona di produzione/consumer imaging e potrebbe risultare un po 'scomodo lavorare con. È completamente ok per caricare le icone pacchettizzate e simili, ma meno adatto per caricare grandi immagini fornite dall'utente, poiché non hai traccia di progresso, feedback di errore piccoli se qualcosa va storto, ecc.

Queste immagini sono anche molto meno utile di BufferedImage s, se si desidera eseguire manipolazioni di immagini di qualsiasi tipo. Non puoi lanciarli su un BufferedImage ma puoi "convertirli", dipingendoli su un BufferedImage.

La classe Toolkit è astratta e si ottiene un'istanza concreta utilizzando Toolkit.getToolkit(). Questa istanza concreta è specifica per la piattaforma e termina utilizzando le chiamate native specifiche del sistema per la maggior parte dei metodi, come il caricamento delle immagini.

L'implementazione di Apple Java ha alcune funzionalità extra, come consentire di caricare le immagini del sistema Apple utilizzando uno speciale schema URI. Sembra che possa caricare anche immagini raggruppate in questo modo, usando la convenzione di denominazione @2x e persino TIFF su più scala o PDF scalabili in OS X per la grafica indipendente dalla risoluzione della tua applicazione.

Nota: affinché funzioni, è necessario comprimere l'applicazione come pacchetto di applicazioni e posizionare le immagini nella cartella Risorse (ad esempio Contents/Resources) del pacchetto. E devi fare riferimento alle immagini usando il suo nome base, senza estensione. Non è possibile utilizzare questa funzionalità per leggere file TIFF casuali non contenuti nella propria applicazione (ad esempio contenuto fornito dall'utente), per quanto ne so.

Inoltre, questa funzionalità è specifico per l'Apple JRE, e funziona solo su proprio JRE di Apple, e su OS X. Non è parte del pubblico API Java, e non funzionerà cross platform. Raccomando di usare la funzionalità con parsimonia e solo per avere una migliore integrazione del sistema (ad esempio, rendere l'applicazione più nativa) su OS X.

Per leggere (e scrivere) qualsiasi TIFF (o qualsiasi altro formato per questo motivo) , dovresti invece usare ImageIO e alcuni plugin adeguati. JRE non viene fornito con plug-in per il formato TIFF per qualche motivo, ma esistono diversi plug-in di terze parti.

Se non si desidera utilizzare JAI (tramite jai_imageio.jar), posso consigliare il mio TwelveMonkeys library which supports TIFF insieme a molti altri formati. Utilizza la licenza BSD open source business-friendly.

Ci sono anche Apache Commons Imaging, iCafe e probabilmente altri che possono leggere TIFF/scrittura, ma questi hanno le loro API personalizzate, che li rendono meno flessibili e più proprietarie IMO.

+0

Che cosa è ??? Maestro! Sei tornato !! – Zizouz212

Problemi correlati