Utiliser un Canvas pour dessiner dedant, et générer une Image - Java - Programmation
Marsh Posté le 06-06-2003 à 15:40:04
Heu ben j'ai pas de réponse mais je suis intéressé
Marsh Posté le 06-06-2003 à 15:57:38
On peut le faire...mais il te faudra quand même un élément graphique affiché pour récupérer un contexte graphiquye valide, sinon, pas moyen....
En gros :
Code :
|
Te donne une image nulle, si c n'est pas affiché....
Donc, si tu fais ça :
Code :
|
tu peux dessiner dans g, sans que i soit jamais affichée....Par contre, si tu enlèves le premier "paragraphe" de code, et que tu fais Image i = c.createImage(..) au lieu de Image i = c2.createImage()
ben tu te prendra une NullPointerException au moment du getGraphics.
Je sais, c'est pas clair!!
Marsh Posté le 06-06-2003 à 16:09:07
gfive a écrit : |
Je crois. ça veut dire que, si je comptais faire ça dans une appli-web, côté serveur, c'est grillé, non ?
Parce que ça risque d'être un joyeux bordel sur le serveur...
Marsh Posté le 06-06-2003 à 16:10:19
LetoII a écrit : Heu ben j'ai pas de réponse mais je suis intéressé |
T'as compris que ça découlair de l'autre topic que j'ai lancé:
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
Marsh Posté le 06-06-2003 à 16:14:55
El_gringo a écrit : |
non non
Marsh Posté le 06-06-2003 à 16:24:13
En fait, on peut le faire :
comme ça :
Code :
|
et là, tu as une image qui va bien, il te reste plus qu'à la sauver dans un fichier, ou en faire ce que tu veux..
Mais attention : si tu utilises un jdk < 1.4, et linux (ou unix) ça nécessitera d'installer X sur ton serveur.
Si tu utilises un jdk >= 1.4, en lancant ton appli avec l'option -Dheadless=true (ou qqchose comem ça) tu n'a pas besoin de X. En plus, avec la nouvelle API javax.imageio, tu pourra sauver ton image dans un fichier beaucoup plus facilement....
J'ai un autre exemple :
Code :
|
bon, je te détaille pas le code, mais en gros, ça dessine des objets (les Tokens) sur une image de fond (source), en utilisant la méthode draw(Graphics g) de chaque Token, et ça sauve le résultat dans le fichier f, en GIF, en utilisant un GIFEncoder, qui est une librairie trouvée sur le net.
Marsh Posté le 06-06-2003 à 16:27:29
LetoII a écrit : |
Ho, ça va, c'était juste un moyen de caser un petit lien vers mon autre topic!
Marsh Posté le 06-06-2003 à 16:31:27
El_gringo a écrit : |
Marsh Posté le 06-06-2003 à 16:35:32
gfive a écrit : En fait, on peut le faire :
|
Cool.
Là tu remet en question ce que tu disais au début, non !?
Pour la sauvegarde par contre, c'est bon. Je sauvegarde pas mes images, je les converti en tel ou tel format, les dimensionne correctement, les oriente correctement, et puis je les balances sur la sortie HTTP d'une servlet. ça, c'est déja géré avec des images générées plus "normalement" (simplement lues dans un fichier).
Merci...
Marsh Posté le 06-06-2003 à 16:38:32
ouais, je me remet en question, effectivement!!
J'avais oublié que j'avais fait ce machin truc... Ca fait plus d'un an, alors bon...
Marsh Posté le 06-06-2003 à 16:45:14
Ha, mais par contre, là tu n'utilises pas de Canvas.
En fait, voila pourquoi je veux faire ça :
j'ai une image générée en C++ par JNI, et je voudrais en récupérer une BufferedImage. Le format "standard" d'images en C/C++, sous windows, et voila le code d'exmple que j'ai trouvé:
Code :
|
Marsh Posté le 06-06-2003 à 16:46:55
bah, a ce moment là, tu modifies ça, pour te passer du Canvas, et tu utilises directement le Graphics, plutôt.....
Marsh Posté le 06-06-2003 à 16:56:50
gfive a écrit : bah, a ce moment là, tu modifies ça, pour te passer du Canvas, et tu utilises directement le Graphics, plutôt..... |
Ben oui, j'suis bête moi.
C'est génial, je vais faire des trucs extraordinaires!
Merci beaucoup.
EDIT : la Java est un langage génial !
Marsh Posté le 11-06-2003 à 09:47:13
gfive a écrit : bah, a ce moment là, tu modifies ça, pour te passer du Canvas, et tu utilises directement le Graphics, plutôt..... |
Hé ben non, apparement, c'est n'est pas possible (ou alors je n'vois pas comment): pour faire ce que je veux, j'ai besoin d'une structure "JAWT_DrawingSurface" valide. Chose que je n'peux obtenir qu'en utilisant "GetDrawingSurface", qui prend pour paramètre un java.awt.Component.
Donc, j'en reviens à la question de départ ( ):
Je voudrais dessiner dans un Canvas, puis obtenir une BufferedImage de ce qui y à été dessiné. Tout ça, sans afficher ce fameux Canvas !
ça vous parait possible ? Comment ?
Marsh Posté le 11-06-2003 à 13:52:22
baaaah...Tupeux instancier un Canvas sans l'afficher, hein...Mais tu aura toujours le problème qu'avec un JDK < 1.4, tu ne pourra pas obtenir une instance de Graphics à partir de ce machin là.....
Marsh Posté le 11-06-2003 à 14:29:05
gfive a écrit : baaaah...Tupeux instancier un Canvas sans l'afficher, hein...Mais tu aura toujours le problème qu'avec un JDK < 1.4, tu ne pourra pas obtenir une instance de Graphics à partir de ce machin là..... |
C'est pas grave, regarde la méthode que j'ai postée : ils n'utilisent pas l'instance de Graphics. Elle est là juste pour correcpondre à la signature, parce qu'ils veulent redéfinir la méthode "paint" de leur Component. Moi, étant donne que c'est juste pour enregistrer une image (et non l'afficher), je pourrait me faire une autre méthode native (genre createJNIImage), sans paramètres, dans laquelle je ferait exactement la même chose que ce qu'ils font.
Reste à trouver comment obtenir un BufferedImage représentant le contenu de ce Canvas...
Marsh Posté le 12-06-2003 à 08:56:30
Pas sur que ce soit des masses utile, mais je tente quand même un petit retour de topic...
Marsh Posté le 12-06-2003 à 09:59:23
Et en faisant ça :
Code :
|
ça suffirait pas???
Marsh Posté le 12-06-2003 à 10:57:48
gfive a écrit : Et en faisant ça :
|
Heu, je sais pas vraiment.
Après avoir fait ça, mon Image i contient ce que j'ai dessiné dedant via la méthode paint ?
Marsh Posté le 12-06-2003 à 13:13:25
Si t'as dessiné dedant, non.. Mais si t'as dessiné dedans, oui!! D
Marsh Posté le 12-06-2003 à 14:13:01
gfive a écrit : Si t'as dessiné dedant, non.. Mais si t'as dessiné dedans, oui!! D |
Heu, y aurait pas comme une erreur dans ce que t'as écrit là !?
Et moi j'reprend ce que j'ai dit :
Avec ce que tu m'a donné un p'tit peu au dessus, mon Image i contient ce que je dessine via la méthode paint ?
Marsh Posté le 12-06-2003 à 14:47:15
Je te faisais juste remarquer que dedans prend un S à la fin, c'est tout!! D
Mais sinon, oui, ça devrait marcher.
(Mais dans le bout de code que j'avais mis, te n'aura normalement pas à mettre de code à l'endroit où j'ai mis "//ton code en natif" parce que c'est fait par l'appel à tonCanvas.paint(g);
ouala.
Marsh Posté le 12-06-2003 à 15:00:05
Ok, merci pour tout.
Dans l'immédiat, j'n'ai pas le temps d'essayer ça, mais dès que j'en saurais plus, je posterai ici pour dire ce qu'il en est bien sur.
Marsh Posté le 14-06-2003 à 13:21:57
Juste un truc : je suis pas sur d'avoir bien tout compris, mais pour dessiner en win32, tu vas avoir besoin du HWND du composant, l'handle de sa fenetre ; et si le composant n'est pas affiché, pas de handle de fenetre. Je me trompe ?
Marsh Posté le 16-06-2003 à 10:50:18
R3g a écrit : Juste un truc : je suis pas sur d'avoir bien tout compris, mais pour dessiner en win32, tu vas avoir besoin du HWND du composant, l'handle de sa fenetre ; et si le composant n'est pas affiché, pas de handle de fenetre. Je me trompe ? |
Pas besoin de HWND pour dessiner en Win32. Un Device Context (DC) suffira.
Marsh Posté le 23-06-2003 à 09:04:15
El_gringo a écrit : |
Arréte moi si je me trompe, ton DC tu le récupère pas à partir d'un Handle? (Ca fait un moment que j'ai pas utilisé ça j'ai un trou de mémoire )
Marsh Posté le 23-06-2003 à 09:07:35
LetoII a écrit : |
Si on veut dessiner dans une vue (ou un autre élément graphique), si, bien sur, il faut récupérer le DC à partir du handle de la fenêtre dans laquelle on veut dessiner. Mais on peut très bien utiliser un DC "virtuel" pour dessiner en mémoire seulement.
Marsh Posté le 06-06-2003 à 15:35:15
Utiliser un Canvas pour dessiner dedant, et générer une BufferedImage, tout ceci sans l'afficher, jamais, ça vous choque ?
EDIT : en fait si ça se trouve, ça sert même à ça un Canvas, j'en sais rien, je n'ai jamais fait d'interface en Java (ni AWT, ni Swing).
Message édité par El_gringo le 06-06-2003 à 15:38:24