IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Graphisme Java Discussion :

dessin réalisable? Java 2D ou autre


Sujet :

Graphisme Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut Reproduction d'une image avec une couleur differente
    Bonjour,

    Voici l'image que j'utilise dans une simulation :
    http://organicbuilder.svn.sourceforg...tures/blue.gif
    Le problème est que j'utilise plusieur fois la meme image mais avec des couleurs differentes. (Même histogrammes.)
    Mon but est donc de ne pas devoir mettre dans l'archive de deploiement une image par couleur voulue.
    La première piste est d'utiliser java 2D pour les faire. Est ce envisageable? (Un cercle, oui mais le dégradé et l'effet de lumière? )
    La deuxième piste que je suis est qu'il est possible de charger une image en specifiant une palette. Cela me permettrait alors de changer les couleurs mais comment avoir les palettes ?

    D'avance merci

    EDIT : Changement de titre, anciennement "dessin réalisable? Java 2D ou autre" (reedit : mais cela ne change pas...)

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 108
    Points : 3 203
    Points
    3 203
    Par défaut
    Java2d me parait pas mal.

    tu fais une classe qui herite d'un JComponent, et tu redefinis la methode PaintComponent(). puis tu passe une heure a bien faire ton dessin et puis tu ajout une methode setColor(Color b) qui changera la couleur du dessin.
    Systèmes d'Informations Géographiques
    - Projets : Unlicense.science - Apache.SIS

    Pour un monde sans BigBrother IxQuick ni censure RSF et Les moutons

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 845
    Points : 22 850
    Points
    22 850
    Billets dans le blog
    51
    Par défaut
    - Tu peux te faire un algorihme de rendu du bouton qui soit generique et prenne une couleur de base que tu derives pour avoir le degrade du bouton.

    - Si ton image a un IndexedColorModel (BufferedImage.TYPE_BYTE_INDEXED je crois) il te sera probablement possible de faire des operations sur la palette. LookUpOp semble destine a faire des operations sur les palettes comme son nom l'indique (lookup table = palette de l'image).

    - Sinon, une idee au pif mais en utilisant des AlphaComposite et des BufferedImageOp tu peux faire des compositions et faire varier la couleur de l'image resultante de la composition (par exemple en composant un calque rouge par dessus une image tu peux faire varier sa couleur vers le rouge).

    Dans tous les cas regarde et n'hesite pas a poser des questions sur le forums Java 2D de http://javagaming.org/ (forum en anglais), c'est probablement le genre de questions courrament posees pour les jeux et pour lesquelles il devrait etre facile de trouver des exemples.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Merci, J'ai deja tenté de faire le dessin, cela m'a pris pas mal de temps.
    Cela http://java.sun.com/products/java-me...ors/Balls.html
    m'a aidé pas mal, mais les bords ne sont pas assez continus... Enfin bon.
    Je vais considérer tes propositions. (dès que j'aurais un peu plus de temps).

    PS : Et je cherchais justement comment manipuler la palette.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 845
    Points : 22 850
    Points
    22 850
    Billets dans le blog
    51
    Par défaut
    [ERREUR]Alors fait attention car cet Applet est TRES TRES ancienne et date probablement de Java 1.0 ou 1.1 et ca m'etonnerai qu'ils l'aient reecrite/fortement modifiee depuis. Donc elle ne doit pas vraiment contenir d'instructions Java 2D. [/ERREUR]

    EDIT - desole je n'avais pas vu qu'il s'agissait de l'exemple de la demo de Java 2D (dans le JDK) qui date des pre-1.2 et qui je crois a ete remodifiee depuis. Je pensais qu'il s'agissait de l'applet Bouncing Ball qui est bien plus ancienne et doit effectivement dater d'une des premieres versions du JDK.

    Le probleme de la bordule se regle en utilisant l'antialiasing. Les dessins et remplissages des cercles et ellipses en Java ne sont pas trop bon sans antialias. C'etait un bug reference dans la bug database il y a quelques temps deja (j'ignore si des amelioration ont ENFIN ete apportee a cet algorithme dans Java 6).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Pourquoi ne pas utiliser java3D et d'ajouter une instance d'une des 4 sous-classes de javax.media.j3d.Light ?

    Un PointLight pourrai reproduire l'effet souhaité

    De plus, je pense que tu te compliquera pas la vie avec quelque chose qui existe déjà

    Bon courage

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Mais Java 3D n'est pas disponible pour tous les clients par defaut?

    (Je sais que cela existe mais pour l'instant je n'ai pas plus regardé que cela, mais ce serait le pied effectivement.)

  8. #8
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Tu peux également charger que cette image, et avec un filtre sur la teinte, modifier la couleur de ton image.

  9. #9
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Mais Java 3D n'est pas disponible pour tous les clients par defaut?

    (Je sais que cela existe mais pour l'instant je n'ai pas plus regardé que cela, mais ce serait le pied effectivement.)
    java3d est developpez à l'origine par sun et maintenu par java.net

    Voir http://java3d.dev.java.net

    De plus avec tes ombres/lumières, tu recherche un effet 3D autant le réaliser directement

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    J'ai regardé l'exemple SphereMotion et c'est en effet ce que je souhaite obtenir mais sans rotation de lumière. (ShaderTestGLSL correspond pas mal aussi. )

    Mon problème est que pour l'instant je ne peut pas me permettre d'inclure java3D car cela triplerait la taille de mon programme.

  11. #11
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Points : 156
    Points
    156
    Par défaut
    Oui, ce que tu demandes est tou à fait possible, il suffit d'écrire une classe qui implémente java.awt.Paint sur le modèle de java.awt.GradientPaint.

    Cette classe ( appelons la CircularGradientPaint ) va prendre les mêmes paramètres de construction que java.awt.GradientPaint à savoir

    - la couleur de départ,
    - la couleur de fin
    - le point de début
    - le point de fin

    de ton dégradé.

    A toi ensuite de produire un dégradé circulaire au lieu d'un dégradé linéaire.

    Je l'ai réalisé, on obtient à peu prés l'effet que tu souhaites. Tu peux après améliorer pour avoir exactement ce que tu veux mais cela va te coûter du temps de dev.
    A+
    H.

  12. #12
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Le dégradé circulaire existe dans Java SE 6. Ton dessin est suffisamment simple pour être refait en Java2D. Cela dit je te conseille de jeter un oeil à la classe RecaleOp du JDK, ou à la classe ColorTintFiler de SwingX, qui te permet de "colorier" une image. Tu pourras ainsi transformer ta balle bleue en balle rouge (c'est un peu équivalent à la fonction Image > Adjustments > Hue/Saturation/Lightness de Photoshop avec la case "Colorize" cochée).
    Romain Guy
    Android - Mon livre - Mon blog

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    J'ai regardé GradientPaint et cela pourrait en effet me servir. Je comprends son fonctionnement a part un point (crucial) : comment le graphics determne t il la couleur a associer à un point en particulier ? Si c'est par le PaintContext alors c'est effectivement la partie que je ne comprends pas. Tout comme la notion de Raster qui reste assez floue...

    Je n'ai pas trouvé la classe RecaleOp. J'ai trouvé par contre ColorTintFiler dont il faudra que j'étudie le code avec plus de precisions plus tard. Concernant Swingx, je n'ai pas réussi à trouver la license, le code serait il compatible avec la GPL ?



    Mon dernier post n'a pas été correctement enregistré.

  14. #14
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Swingx est en LGPL:

    https://swingx.dev.java.net/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    D'accord, merci. Donc compatible GPL.

    J'ai téléchargé l'archive comportant les sources de la release 0.7. Selon la javadoc, le classe ColorTintFilter se trouve dans le package org.jdesktop.swingx.image.ColorTintFilter. Je trouve dans l'archive org.jdesktop mais pas org.jdesktop.swingx !

  16. #16
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Normal la version 0.7 est antidéluvienne.
    Pour SwingX mieux vaut récupérer les weeklies

    http://swinglabs.org/hudson/job/Swin...eekly%20Build/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Effectivement et pourtant j'avais bien trouvé cette classe dans la doc. (EDIT : le lien portait sur la dernière version mais ce n'était pas explicite... )

    Le principe des BufferedImageOp est en effet intelligent. Et je pense que si je peux passer par une telle classe pour creer mes variations d'images ce serait la bonne solution.
    J'ai testé le filtre mais je n'obtiens pas ce que je souhaiterais. J'imagine que je n'utilise pas la bonne image source ou les bons paramètres pour mon filtre...
    J'ai egalement testé avec une version en nuance de gris pour l'image source mais les teintes produisent alors également des images en nuances de gris...

    En pièce jointe, un exemple d'application du filtre. Le but étant bien sur d'obtenir une image 'identique' à l'image original bleue mais dans une autre couleur...
    Fichiers attachés Fichiers attachés

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Concernant le gradient circulaire, j'ai repris les classes que sinok a posté dans un sujet archivé.
    Et j'obtiens une image assez proche de ce que je souhaitais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
              RenderingHints.VALUE_ANTIALIAS_ON);
    Color color1 = Color.WHITE;
    Color color2 = Color.BLUE;
    RoundGradientPaint gradient = new RoundGradientPaint(w/3, h/3, 
              color1, new Point2D.Double(w/2, h/2), color2);
    g2.setPaint(gradient);
    g2.fillOval(0, 0, w, h);
    Au sujet de cette methode :
    * license : je place les classes sous GPL mentionnant l'auteur comme sinok ?
    * performance : l'image devant etre peinte très souvent, faut il mieux utiliser le gradient à chaque fois ou sauvegarder le résultat dans une BufferedImage ?

    EDIT : Pour ceux qui cherchent comment realiser ce gradient, le jdk 6 en propose bien un : le RadialGradientPaint.

  19. #19
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Alors pour commencer

    A priori je ne suis pas tout à fait l'auteur de ceci (c'est arrangé à ma sauce, mais je ne sais plus trop où je l'avais choppé c'était il y a plus d'un an de çà.)

    Donc pour la license bahhh retrouver l'original et voire en quoi il diffère, mais si je me souviens bien c'était en open source, de toute façon c'était publié sur le net.


    Ensuite au niveau perfs, crée une fois ton gradient dans une image et réutilise ton image par la suite, la création d'un Gradient est une opération plutô lourde.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    En ce qui concerne la source
    * http://examples.oreilly.com/java2d/examples/
    Et pour la license
    * http://www.oreilly.com/pub/a/oreilly...odepolicy.html
    Cet aspect est donc réglé.
    Et l'intégration va être rapide.

    Il me reste plus qu'à resoudre mon problème de 'teinte'.

    Une piste que je creuse :
    Est il possible pour le cas de la version grise que Java considère que l'image est en nuance de gris seulement et que l'image resultante doit l'être également...
    EDIT : J'ai testé et c'est bien le bon type...

    SI vous voyez d'autres explications, je suis preneur.

Discussions similaires

  1. créer un jar d'une appli java utilisant d'autres jar
    Par jakouz dans le forum Général Java
    Réponses: 2
    Dernier message: 14/02/2007, 17h20
  2. dessiner en java
    Par ivanoe25 dans le forum Graphisme
    Réponses: 7
    Dernier message: 17/08/2006, 18h06
  3. dessin en java
    Par menuge dans le forum Graphisme
    Réponses: 4
    Dernier message: 01/06/2006, 18h36
  4. Dessiner en Java
    Par ankou82 dans le forum 2D
    Réponses: 15
    Dernier message: 07/04/2006, 10h28
  5. Application lourde en Java, Swing ou autre...
    Par eponette dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 23/09/2005, 22h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo