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

2D Java Discussion :

Dessin sous awt


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 35
    Par défaut Dessin sous awt
    Bonjour,
    je voudrais pouvoir faire une certaine manipulation :

    imaginons un JPanel dans lequel on dessinne tout genre de choses en utilisant les méthodes paint(Graphics g)

    Est-il possible de récupérer une partie de cette image sous forme de gif?

    je m'explique : je dessine par exemple un bouton qui utilise plusieurs couleurs, mais je ne veux pas avoir à appliquer a chaque fois la méthode paint de ce bouton qui est longue à calculer, mais simplement, apres l'avoir dessiné une fois, pouvoir l'enregistrer sous forme de gif et par la suite l'afficher avec la méthode drawImage(...)

    merci de votre réponse
    Ketzal

  2. #2
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    Ce que je pourrais te conseiller, c'est d'avoir une BufferedImage que tu dessines avec drawImage(). Tu fais un maBufferedImage.createGraphics() qui te renvoie un graphics2D pour dessiner sur ton imgae, et ensuite tu n'as plus qu'à réutiliser cette image... Si tu veux vraiment la stocker sous forme de GIF, il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ImageIO.write(maBufferedImage,"gif",new File(aFileName));
    (je n'ai pas testé avec GIF, mais avec jpeg ça fonctionne )

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 35
    Par défaut
    Voici mon code.
    Ici par exemple, je dessine un rectangle rempli a l'interieur.
    lorsque je fait ce que tu m'a dit, l'image que je recoit est un carré de la bonne taille, mais rempli de noir, (ce que je n'ai pas demandé), et a l'affichage(drawImage), rien n'est affiché...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public void init(){
    		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
    		Graphics2D g = image.createGraphics();
     
    		g.setColor(borderColor);
    		g.drawRect(xLocation,yLocation,width,height);
    		g.setColor(insideColor);
    		g.fillRect(xLocation+1,yLocation+1,width-1,height-1);
    		try {
    			ImageIO.write(image,"jpeg",new File("monImage.jpg"));
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
                    paint(g);
    	}
     
            public void paint(Graphics g){
    		g.drawImage(image, 100, 100, null);
            }

  4. #4
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    ton objet image dans paint(), il vient d'où ?
    Parce que ta BufferedImage image, elle est locale à la procédure init,non ?
    Donc, dans ton paint, je vois pas trop ce que tu dessines...

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 35
    Par défaut
    c'est parce que je n'ai pas ecrit exactement le code que j'ai dans eclipse...

    chez moi tout est dans une fonction

    je vais te mettre la totalité si tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public void paint(Graphics gg){
    		int a,b,c;
     
    		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    		Graphics2D g = image.createGraphics();
     
    		g.setColor(borderColor);
    		g.drawRect(xLocation,yLocation,width,height);
    		g.setColor(insideColor);
    		g.fillRect(xLocation+1,yLocation+1,width-1,height-1);
    		a = insideColor.getRed();
    		b = insideColor.getGreen();
    		c = insideColor.getBlue();
    		g.setColor(new Color(a+40,b+40,c+20));
    		g.drawRect(xLocation+4,yLocation+3,width-8,0);
    		g.setColor(Color.white);
    		g.drawRect(xLocation+5,yLocation+4,width-10,0);
    		g.drawRect(xLocation+6,yLocation+5,width-12,0);
    		g.setColor(new Color(a+40,b+40,c+20));
    		g.drawRect(xLocation+7,yLocation+6,width-14,0);
     
    		Graphics2D g2 = (Graphics2D)gg;
     
    		g2.drawImage(image, 100, 100, null);		
    	}

  6. #6
    Membre expérimenté Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Par défaut
    bon ben écoute, chez moi ça fonctionne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    import java.awt.*;
     
    import javax.swing.*;
    import java.awt.image.*;
    import java.util.*;
     
    public class PanelGraphique extends JPanel
    {
     
    	private int height=100;
    	private int width=100;
    	private Color borderColor=Color.blue;
    	private Color insideColor=new Color(150,50,10);
     
    	private BufferedImage image=null;
     
    	public PanelGraphique(){
    		this.setOpaque(true);
    	}
     
    	private void init() {
    		int a,b,c=0;
    		image = new                    BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
    		Graphics2D g = image.createGraphics();
     
    		g.setColor(borderColor);
    		g.drawRect(0,0,width,height);
    		g.setColor(insideColor);
    		g.fillRect(0+1,0+1,width-1,height-1);
    		a = insideColor.getRed();
    		b = insideColor.getGreen();
    		c = insideColor.getBlue();
    		g.setColor(new Color(a+40,b+40,c+20));
    		g.drawRect(0+4,0+3,width-8,0);
    		g.setColor(Color.white);
    		g.drawRect(0+5,0+4,width-10,0);
    		g.drawRect(0+6,0+5,width-12,0);
    		g.setColor(new Color(a+40,b+40,c+20));
    		g.drawRect(0+7,0+6,width-14,0);
     
    	}
     
    	public void paint(Graphics gg){
    		super.paint(gg);
    		if (image==null) this.init();
    		Graphics2D g2 = (Graphics2D)gg;
     
    		g2.drawImage(image, 100, 100, null);		
     
    	}
    }
    Je l'ai mis dans une JFrame en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PanelGraphique jc = new PanelGraphique();
    	jc.setPreferredSize(new Dimension(100,100));
    	this.setContentPane(jc);
    bon, enfin un truc dans le genre...

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par dazz_x
    (je n'ai pas testé avec GIF, mais avec jpeg ça fonctionne )
    Le GIF Writer devrait etre inclus dans Java 6 (probablement puisque les divers copyrights et brevets sur ce format d'image sont arrives a expiration).

    Quel est le rapport entre tout ceci (Java2D et Swing) et l'AWT ? j'ai des demengeaison de renommage de topic...

    Sinon tu ne dois pas appeler toi-meme la methode paint() du composant (pour faire un affichage a l'ecran) ; cette methode est appellee pour toi par le repaint manager de Swing/AWT. Tu peux appeler repaint() quand tu veux demander un rafraichissement de l'affichage.

    Et evite de creer une image dans ton paint() , cela veut dire que tu creerai une image a chaque fois que ta fenetre se reaffiche/raffraichi son affichage. Suit plutot la methode de dazz_x.
    Et n'oubliez pas de disposer (via la methode dispose()) le graphics de l'image quand vous avez fini de l'utiliser.
    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

  8. #8
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut a propos de g.dispose()
    Je voudrais faire la constatation que dispose() enlève tout accès futur à l'objet graphique. Donc si l'application est multi-threadée, il est peu évident de faire un dispose(), sachant que l'objet graphique pourrait être appelé par un autre thread. A bon entendeur comme on dit en Suisse. :: <- c le drapeau

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 35
    Par défaut
    Oulala... qu'est ce que ca fait du bien une bonne nuit de sommeil....

    désolé, je vous ai fait cherché pour rien mais en me levant ce matin j'ai trouvé la solution....

    Le dessin ne s'affichait pas parce que je suis passe d'une methode paint normale a une methode paint utilisant les images...

    Ce qui fait que j'ai créé mon image en lui donnant une taille (largeur hauteur) et une location(xLocation, yLocation)
    Seulement j'ai oublié de remettre les locations à 0 ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    Graphics2D g = image.createGraphics();
     
    g.setColor(borderColor);
    g.drawRect(xLocation,yLocation,width,height);
    j'avais laissé la location initiale. c'est pour cela qu'il dessinait bien dans le contexte graphique il tapais en dehors des limites de l'image...
    donc ca ne m'inscrivait que du noir dans mon image...

    en remettant ces locations à 0, tout marche bien

    Désolé, autant pour moi vous ne pouviez pas le trouver.......
    Ketzal

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Nous parlons bien du graphics de l'image, pas de celui de la methode paint() (ce dernier ne doit surtout pas etre dispose). A priori sa methode init() se deroulant dans l'EDT il n'est pas dans un evirronnement multithreade. Si jamais sa methode paint() doit etre appelee depuis un envirronement multithreade, c'est a lui de faire le necessaire (une synchronisation du test if (image==null) this.init();) pour prevenir une utilisation d'un meme graphics de l'image par 2 threads differentes (ce qui peut arriver si deux methode init() sont lancees en concurrence:
    -init()1 cree une image image1
    -init()2 cree une image image2
    -init()1 utilise le graphics de image2
    -init()2 utilise le graphics de image2
    ).

    De plus :
    Comment dessiner et écrire sur une BufferedImage ?
    Citation Envoyé par FAQ GUI java
    Si vous ne faites pas de dispose() sur le contexte graphique et que vous rafraichissiez beaucoup celui-ci durant l'utilisation du programme, votre programme sera de plus en plus gourmant en mémoire.
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insérer un dessin sous Paint dans un fichier Latex
    Par meloelody dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 5
    Dernier message: 17/05/2007, 11h27
  2. dessin sous un bouton
    Par mabelleau dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/03/2007, 13h12
  3. Equation des droites dessinées sous Canvas
    Par sofiane_bentayeb dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/12/2006, 07h43
  4. Dessiner sous MS Access - AccessPaint
    Par gregrywan dans le forum Access
    Réponses: 7
    Dernier message: 23/01/2006, 11h08
  5. dessiner sous access
    Par fthem dans le forum Access
    Réponses: 1
    Dernier message: 12/01/2006, 18h35

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