2015-08-19 3 views
7

J'ai lu les outils de développement OS X Java, afin de rendre mon application plus "native" avec le système d'exploitation. J'ai trouvé quelque chose d'intéressant dans ce section particulier. (Souligné par l'auteur)Comment Java charge-t-il les NSImages natifs?

Pour charger un fichier de résolution indépendant tiff, icns, ou pdf du dossier Ressources de votre paquet d'applications dans votre application Java, utilisez la méthode getImage() de java.awt.Toolkit. La chaîne que vous passez en getImage() est de la forme "NSImage://MyImage". N'incluez pas l'extension de fichier de l'image. Sachez également que le moteur de rendu Sun 2D est désactivé lorsque le facteur d'échelle de l'interface utilisateur n'a pas la valeur 1.0. Utilisez le moteur de rendu Quartz pour que vos images évoluent en douceur.

Être familier avec javax.imageio, cela vient comme une surprise complète, que je ne connaissais aucun autre moyen de charger d'autres types de fichiers en images. Surtout avec une plate-forme obsolète et absolument pas de support pour les fichiers tels que .tiff. Par exemple, un test rapide sur mon ordinateur me donne ceci:

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

J'ai essayé de charger une image simple .tiff et testé ceci:

 
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) 
} 

Il donne rien:

enter image description here

J'ai réessayé: Cette fois-ci, en ajoutant l'image dans le dossier de base de mon projet java, et en tapant ceci dans une chaîne: "NSImage://test_image.tiff". Comme tout ce que je fais, ça ne marche pas.

Cependant, si je change ma chaîne de chemin de fantaisie à un NSImage un, comme "NSImage://NSApplicationIcon" ...

enter image description here

Il fonctionne. J'ai fait une recherche rapide de NSImage, et j'en ai trouvé un. Il semble que le type de fichier pour ces images est .png. C'est assez dérangeant, car je m'attendais à ce qu'une image correcte en sorte. Rappelez-vous, je m'attendais aussi à quelque chose: si elle attend des arguments de la forme "NSImage://something", alors il pourrait simplement ignorer tout autre chose.

De toute évidence, j'ai quelques questions:

  • Comment la boîte à outils charger l'image? Si je tente de charger une image .tiff de mon bureau, ce que je reçois si je l'appelle .toString():

    [email protected] // Also can't be cast to java.awt.BufferedImage 
    
  • -ce que les lecteurs (et écrivains le cas échéant) partie d'une API publique? En d'autres termes, je peux appeler quelque chose à charger mon fichier .tiff dans un Image (que je peux ensuite jeté dans un `BufferedImage?

  • Et là encore, si les lecteurs/écrivains font partie de l'API, pourquoi n » t le paquet javax.imageio les localiser?

Cela peut ressembler à une poignée, (oui je suis désolé pour ruiner votre journée sur cette question), mais pour moi, cela ressemble prévu, mais en même temps un comportement erroné. Marques bonus: Y a-t-il une API d'imagerie conviviale (c'est-à-dire Open Source) (pas le JAI) qui peut traiter les fichiers .tiff (et autres)?

Répondre

1

Vous posez plusieurs questions ici, mais je ferai de mon mieux pour tout interpréter. :

L'utilisation du Toolkit pour charger des images (java.awt.Image et des amis) fait partie de l '"ancienne" API asynchrone de production/consommation d'images de consommateurs, et peut sembler un peu difficile à utiliser. Il est tout à fait correct pour charger des icônes empaquetées et semblables, mais moins approprié pour charger de grandes images fournies par l'utilisateur, car vous n'avez aucun suivi de progression, peu d'erreur de retour si quelque chose tourne mal, etc

Ces images sont également beaucoup moins utile que BufferedImage s, si vous souhaitez effectuer des manipulations d'image de toute nature. Vous ne pouvez pas les convertir en BufferedImage mais vous pouvez les "convertir" en les peignant sur un BufferedImage.

La classe Toolkit est abstraite et vous obtenez une instance concrète en utilisant Toolkit.getToolkit(). Cette instance concrète est spécifique à la plateforme et finit par utiliser des appels natifs spécifiques aux systèmes pour la plupart des méthodes, comme le chargement d'images. L'implémentation Java d'Apple comporte des fonctionnalités supplémentaires, telles que le chargement d'images système Apple à l'aide d'un schéma URI spécial. Il semble qu'il peut également charger des images groupées de cette façon, en utilisant la convention de dénomination @2x, et même des fichiers TIFF multi-échelles ou des PDF évolutifs sous OS X pour des graphiques indépendants de la résolution pour votre application. Notez que pour que cela fonctionne, vous devez emballer votre application en tant que groupe d'applications et placer vos images dans le dossier Ressources (par exemple, Contents/Resources) de l'ensemble. Et vous devez vous référer aux images en utilisant son nom de base, sans extension. Vous ne pouvez pas utiliser cette fonctionnalité pour lire des fichiers TIFF aléatoires non emballés avec votre application (c'est-à-dire le contenu fourni par l'utilisateur), pour autant que je sache.

De plus, cette fonctionnalité est spécifique à l'Apple JRE, et ne fonctionnera que sur propre JRE d'Apple, et sur OS X. Il ne fait pas partie de l'API Java public et il ne fonctionnera pas multi-plateforme. Je recommande d'utiliser la fonctionnalité avec parcimonie, et seulement pour avoir une meilleure intégration du système (c'est-à-dire rendre votre application plus native) sur OS X.

Pour lire (et écrire) tout format TIFF (ou tout autre format pour cela) , vous devriez plutôt utiliser ImageIO et quelques plugins appropriés. Le JRE ne vient pas avec des plugins pour le format TIFF pour une raison quelconque, mais plusieurs plugins tiers existent.

Si vous ne voulez pas utiliser JAI (par le biais de jai_imageio.jar), je peux recommander mon propre TwelveMonkeys library which supports TIFF ainsi que d'autres formats. Il utilise la licence BSD Open Source conviviale.

Il y a aussi Apache Commons Imaging, iCafe et probablement d'autres qui peuvent lire/écrire du TIFF, mais ceux-ci ont leurs propres API personnalisées, ce qui les rend moins souples et plus propriétaires.

+0

Qu'est-ce qui est ??? Maîtriser! Tu es revenu!! – Zizouz212