-
Créer des images
Bonjour,
Je suis un novice en Java, et je dois dire que j'ai un peu du mal à faire la différence entre les différents types d'images : Graphics, Graphics2D, Image, BufferedImage...
Tout d'abord, j'aimerais savoir comment faire pour manipuler une image pixel par pixel et l'afficher à l'écran. Ensuite, étant donné que l'applet en question sera intégré dans une page web, j'aimerais pouvoir proposer aux utilisateurs d'enregistrer l'image en question sur le disque dur...
Pour la manipulation d'images, j'utilise actuellement une classe héritée de JPanel où j'ai surchargé la fonction "paint", et où pour créer chaque pixel je dessine un rectangle de dimension 1x1... Autant dire que c'est assez bourrin ! :mrgreen:
Merci d'avance pour vos réponses !
PS : Désolé si ma question a déjà été posée, j'ai déjà passé plusieurs heures à chercher :?
-
Pour afficher une image dans une fenetre tu peux utiliser la classe ImageIcon ça te permettra de l'afficher.
-
En fait, mon problème n'est pas l'affichage mais surtout la création d'une image et sa modification pixel par pixel :?
-
Graphics est un un contexe graphique, a savoir une abstraction d'une surface de dessin qui peut etre une image memoire, un ecran, une imprimante, un fichier (pour certains formats d'images vectoriels et certaines API). Ca permet de dessiner independament de la sortie. En general on utilisera cette maniere pour dessiner car on cherche toujours a dessiner independament de la sortie (voir java.awt et java.awt.font).
Graphics2D est une extension de Graphics qui supporte Java2D (permet de faire du dessin comme en PostScript/PDF/... a l'aide de primitives de dessin vectoriel et autre, voir java.awt.geom et java.awt.image). La quasi-totalite des Graphics dans Java sont des Graphics2D ; tu peux donc faire :
Code:
Graphics2D g2d = (Graphics2D)g;
On peut egalement specifier des indices de rendu (RenderingHints) qui influent sur le resultat, utiliser des textures et gradients, dessiner des courbes. C'est egalement la classe que tu utiliseras le plus pour dessiner independament de la sortie.
Une Image est la classe de base representant des image (tous types confondus). Il est bien sur possible d'obtenir un Graphics a partir d'une image.
Une BufferedImage est une classe plus recente qui represente une Image en memoire centrale dont tu peux directement manipuler les pixels avec les methodes setRGB() et getRGB(). Les variantes de ces methodes permettent de manipuler soit un pixel, soit un ensemble de pixel. Il est en plus possible d'obtenir directement un Graphics2D a partir d'une telle image. Il existe egalement des operations qui permettent d'effectuer des filtrages (flou, nettete, etc... voir ConvolveOp, BufferedImageOp, etc... ) sur ce genre d'image ou de manipuler leur palette (suivant leur ColorModel) (voir java.awt.image)
Note que quand les BufferedImage sont compatibles avec l'affichage celui-ci est plus rapide (faire des recherches sur le forum avec "image compatible gfx").
Une VolatileImage est une image qui est chargee dans la memoire de la carte video pour une acceleration maximum. Mieux vaut trouver des exemples sur les methodes correctes pour les utiliser. Comme leur nom l'indique leur contenu est volatile et peut disparaitre. Dans la majorite des cas tu ne les utiliseras pas.
Dessiner un pixel comme tu le fais est une methode correcte quand tu utilise un Graphics. Attention cependant les resultats peuvent varier celon les indices de rendu qui sont actifs (surtout RenderingHints.KEY_ANTIALIASING).
Pour ecrire l'image sur le disque tu peux utiliser javax.imageio.ImageIO ou des lib externes (Batik ou VectorGraphics ou autre pour les formats vectoriels) ou ta propre lib d'ecriture si tu connais bien un format d'image (le PBM, PGM et PNM sont suffisement simples pour pouvoir les ecrire soi-meme).
-
Merci beaucoup pour ta réponse ! C'est bien plus clair pour moi maintenant :)
Par contre, ne devrais-je pas plutôt utiliser BufferedImage si cela permet de manipuler les pixels sans bricolage ? Ou les performances seraient similaires à celle de Graphics ?
Sinon, je reviens à mon autre question : est-il possible de proposer aux utilisateurs d'enregistrer l'image produite ?
-
J'ai rajoute la reponse a ta question en fin du message. CEPENDANT une Applet non-signee n'a pas le droit d'ecrire sur le disque local de son utilsateur. Si c'est ce que tu veux faire, il te faudra donc donc signer numeriquement ton Applet. Il me semble qu'il est egalement possible de modifier les fichier Policy du JRE mais il faudra alors le faire sur tous les postes clients et ce n'est probablement pas souhaitable pour des raisons de securite (note que Vista en rajoutant une couche (au niveau de la securite), j'ignore donc si une Applet meme signee marche correctement sous Vista).
Concernant la manipulation pixel a pixel ca depent vraiment de ce que tu veux faire mais moi je n'en fais jamais ; je dessine principalement via des Graphics2D. Peut-etre qu'effectivement, dans ton cas a toi, manipuler une BufferedImage peut s'averer plus pratique.
-
En effet, dans mon cas je pense que la manipulation pixel par pixel n'est pas superflue car il s'agit par exemple de générer des images avec des formules mathématiques...
Par contre, les contraintes pour l'enregistrement m'embêtent un peu. M'enfin en tout cas le problème est résolu ! :)
Merci !
-
Pour generer une fractale mieux vaut en effet manipuler un int[] et utiliser la methode setRGB() qui va bien a mon sens.
Plutot qu'une Applet tu peux egalement voir pour creer une application et utiliser Java Web Start pour la distribution. Mais la aussi de toute maniere ca marche mieux quand ton JAR est numeriquement signe. Note que keytool et jarsigner (outils du JDK) te permet de creer toi-meme un certificat temporaire de 6 mois, mais tes utilisateurs seront bien sur avertit que l'autenticite de ce certificat ne peut pas etre verifie.
Voir Signing JAR Files With a Test Certificate