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

Interfaces Graphiques en Java Discussion :

Comment faire d'un Graphics un BufferedImage


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut Comment faire d'un Graphics un BufferedImage
    Bonjour,

    J'essaie depuis deux jours d'enregistrer en JPEG des images crées dans JPanel avec les méthodes de la classe Graphics. Voilà où j'en suis :

    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
    class SauverUneImage extends AbstractAction{
     
    	public SauverUneImage (Panneau pan) {
    		this.pan = pan;
    	}
     
    	public void actionPerformed(ActionEvent e){
    		g = pan.getGraphics();
    		Image LeDessin = pan.createImage(800, 550); 
    		/*Je n'ai pas trouvé comment me servir de ce dessin*/
    		/*Je n'arrive pas à faire la liaison entre le JPanel pan contenant le graphisme g et le BufferedImage*/
     
     
    	{String CreeFich = JOptionPane.showInputDialog 
    	(null, "Veuillez entrer le nom de votre image JPEG");
    	try {if (CreeFich != null)
    {FileOutputStream ArchImg = new FileOutputStream(CreeFich + ".jpg");
    /*Dois-je créer un File avant le FileOutputStream comme je l'ai vu parfois?*/
    	Rectangle Rect = pan.getBounds();
              /*Pareil, comment m'en servir?*/
    	BufferedImage image = new BufferedImage(pan.getWidth(),pan.getHeight(),BufferedImage.TYPE_BYTE_INDEXED);
    	Graphics2D graph = image.createGraphics();
    	pan.paintAll(g);//what for?
     
    	JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(ArchImg);
             encoder.encode(image);
             ArchImg.close();
    		}
    		}
    	catch (Exception Ft){
    		System.out.println("raté!");//pour l'instant.
    		}
    	}
    	}
     
    	Panneau pan;
    	Graphics g;
    	BufferedImage image;
     
    }
    pan est le JPanel. Pour l'instant, je n'utilise pas de JFileChooser.

    L'encodeur JPEG marche, je l'ai testé avec une capture d'écran. Mais je n'arrive pas à faire de mon pan une image. En fait, alors que BufferedImage dérive de la classe Image, pan.createImage(800, 550) est refusé par le compilateur. Pour l'instant, la méthode me sort un JPEG de bonne dimension, mais tout noir!

    Auriez vous une idée s'il vous plaît de ce que je dois faire? Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Je suis désolé, mais je n'y arrive toujours pas. Je veux bien être bête, mais quand même!

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try {if (CreeFich != null)
    	{File ArchImg = new File(CreeFich + ".jpg");
    	GraphicsConfiguration GrConf = pan.getGraphicsConfiguration() ;
    	BufferedImage image = GrConf.createCompatibleImage(pan.getWidth(),pan.getHeight()) ;
    	ImageIO.write(image, "jpg",ArchImg);
    		}
    	}
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try {if (CreeFich != null)
    	{FileOutputStream ArchImg = new FileOutputStream(CreeFich + ".jpg");
    	GraphicsConfiguration GrConf = pan.getGraphicsConfiguration() ;
    	BufferedImage image = GrConf.createCompatibleImage(pan.getWidth(),pan.getHeight()) ;
    	JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(ArchImg);
    	encoder.encode(image);
    	ArchImg.close();
    		}
    	}
    A chaque fois, cela me fait un beau JPEG de bonne dimension... tout noir!!

    Quelqu'un veut-il bien m'aider?

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    En vrac :
    • createImage est refusé par le compilateur probablement à juste raison, mais avec ce que tu nous dis, il est difficile d'expliquer plus avant,
    • lorsque tu crées un Graphics, il faut penser à faire le dispose lorsque tu ne t'en sers plus,
    • lorsque tu veux dessiner dans une image, il faut employer le Graphics correspondant (ainsi dans la première question, je pense qu'il faudrait plutot employer pan.paintAll(graph) à la place de pan.paintAll(g),
    • et enfin si tu veux avoir une image qui ait quelque chose dedans il faut dessiner quelque chose dedans !

    Bref, je pense qu'un peu plus de rigueur te serait nécessaire... procède pas à pas, en validant chaque étape au fur et à mesure, par exemple.

    Bon courage.

  4. #4
    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
    Ben oui, il est tout noir car :

    1) un JPEG est opaque et ne supporte pas la transparence. Il faut donc mettre toi-meme le fond a blanc avec un fillRect() sur toute la surface de dessin si ton composant ne couvre pas toute la surface (ce qui peut arriver dans le cas de labels ou de boutons).

    2) Tu ne peins pas le composant dans le Graphics de l'image donc evidement il ne risque pas de s'y afficher. Faut appeler paint() avec le Graphics fourni par l'image en parametre.
    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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    Merci, bouye et gifffftane pour ces premières réponses.

    Le dessin est créé avec une classe "Panneau", dont pan est une instance. Il s'agit de figures fractales à base de points tracés avec g.drawOval + un fond en couleur avec setBackground. Je ne lance ma classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new SauverUneImage(Panneau pan)
    que lorsque le dessin est apparu à l'écran.

    Soit je récupère le dessin à l'écran, soit je le refais faire dans la classe SauverUneImage si je comprends bien? Comment pourrais-je introduire dans "SauverUneImage" le graphisme déjà à l'écran pour pouvoir ensuite l'enregistrer? Je pense que le problème vient de là.

    J'ai essayé une capture d'écran, mais :
    - le haut de la fenêtre apparaît aussi, ce que je ne veux pas.
    - le JOptionPane.showInputDialog laisse une belle marque blanche au beau millieu de l'image...
    - l'image est un peu décolorée lorsque j'ouvre le JPEG une fois créé.

    Je crois que j'ai (de nouveau) un problème de communication entre mes classes, tout simplement. Mes méthodes marchent prises une à une, mais communiquent mal. Je vais essayer ce soir une méthode de type
    au sein de la classe "TracePlan" (là où le dessin est créé) et l'utiliser depuis "SauverUneImage". Qu'en pensez-vous?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Par défaut
    J'ai fait aussi bien une méthode public BufferedImage ()
    qu'une méthode public Graphics () depuis la classe Panneau (où est fait le graphisme),
    je n'arrive toujours pas à récupérer le dessin à l'écran dans un BufferedImage pour faire le JPEG.

    Comment faites vous pour faire un JPEG d'un composant Graphics? Il y a bien quelqu'un qui sait faire? Moi, vraiment, je ne trouve pas!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/11/2008, 01h22
  2. comment faire evoluer ma base vers interbase6
    Par toure32 dans le forum InterBase
    Réponses: 5
    Dernier message: 23/10/2002, 10h59
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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