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 :

Question sur les images avec Swing


Sujet :

2D Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Question sur les images avec Swing
    Bonsoir,

    Voila je me posais une question, j'ai une image (une forme géométrique quelconque) au format png (ou autre si png n'est pas lu par swing) d'une certaine couleur (noir). Lorsque j'ouvre ma frame j'ai un panel contenant quelques JRadioButton correspondant chacun à une couleur différente et l'autre en dessous contenant l'image.

    Ce que j'aimerai c'est que quand l'utilisateur clique sur un bouton radio l'image prenne la couleur correspondant au bouton radio. Je voudrais faire ceci afin d'éviter de dessiner dans le code plein de formes de différentes couleurs, alors qu'ici une simple image de la forme dessiner avec Gimp (ou autre) me faciliterais bien la tâche.

    Est possible de faire ceci avec Swing ? Et si oui peut on me donner un exemple ou une piste svp ? Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    C'est intéressant .

    Si je devais faire ça, je commencerais par me demander si je ne peux pas plutôt faire un fichier ou une classe qui décrit ce qu'il faut faire pour dessiner la forme. Comme ça, changer de couleur n'est qu'une affaire de changer la couleur du Graphics2D et redessiner la forme.

    Si ce n'est pas possible, je préférerais enregistrer les différentes images, en ayant l'image principale en noir, et des scripts pour générer les images en d'autres couleurs.

    Et si ce n'est pas possible non plus (genre il y a des centaines de couleurs,) alors je ferais comme ça :
    - L'image est en PNG avec transparence. Partout où il y a du noir est opaque, partout où il n'y en a pas est transparent.
    - Je charge l'image PNG dans un BufferedImage de type ARGB.
    - Quand je veux changer de couleur, je modifie tous les pixels pour :
    -- laisser le canal alpha inchangé
    -- changer les canaux rouge, vert et bleu.
    - Puis, dessiner le BufferedImage ainsi modifié.

    À noter que le tableau de pixels d'un BufferedImage img de type ARGB peut être obtenu en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[] pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
    Ou si l'image est grande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int[][] pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getBankData();
    et il faut itérer sur tous les tableaux.

    Pour modifier un pixel int source vers une couleur int color sans toucher au canal alpha, on peut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    source = (source & 0xFF000000) | (color & 0xFFFFFF);
    ce qui est d'une assez bonne efficacité.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Ok je vois que c'est un peu plus compliqué que ce que je pensais en plus j'ai essayé une chose mais cela ne marche pas vraiment (cela doit très certainement venir du fait que je n'ai pas tout compris)

    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
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferInt;
    import java.io.File;
    import java.io.IOException;
     
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
     
     
    public class ChangeImage extends JFrame {
    	private static final long serialVersionUID = -6514250796765365776L;
    	private File file;
    	private BufferedImage image;
     
    	public static void main (String[] args) {
    		ChangeImage img = new ChangeImage ();
    	}
     
    	public ChangeImage () {
    		this.file = new File ("C:\\Users\\scary\\Desktop\\carre.png");
    		try {
    			this.image = ImageIO.read (file);
    		} 
    		catch (IOException e) {
    			e.printStackTrace();
    		}
    		int[] pixels = ((DataBufferInt) this.image.getRaster().getDataBuffer()).getData();
    		int color = 0;
    		for (int i=0;i<pixels.length;i++) {
    			pixels[i] = (pixels[i] & 0xFF000000) | (color & 0xFFFFFF);
    		}
    		this.setVisible(true);
    		this.repaint();
    	}
     
    	public void paint (Graphics gc)
    	  {
    	    if (this.image != null)
    	    {
    	      // Affichage des images
    	      gc.drawImage (this.image, 0, 0, this);
    	    }
    	  }
    }
    J'ai mis en pièce jointe la petite figure que j'essai de modifier (il y en a pas mal d'autres aussi) et je voudrais que au lieu qu'elle soit rouge, la mettre en noir, jaune, vert enfin la couleur qu'on veut.

    Aussi je n'arrive pas trop à voir comment marche la modification du pixel. En tout cas merci de cette piste
    Images attachées Images attachées  

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    C'est bon en fait je suis vraiment nul il suffit tout simplement de regarder la doc de certaines Classe et de lire et pouf ça marche C'est magic Voila le code:

    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
    53
    import java.awt.Color;
    import java.awt.image.BufferedImage;
    import java.io.File;
     
    import javax.imageio.ImageIO;
     
     
    public class ChangeImage {
    	public static void main (String[] args) {
    		ChangeImage image = new ChangeImage ();
    		image.change();
    	}
     
    	public void change () {
    	try {
    		BufferedImage img=ImageIO.read(new File("C:\\Users\\scary\\Desktop\\carre.png"));
     
    		// parcourir les pixels de l'image
    	for (int i = 0; i < img.getWidth(); i++) {
    		for (int j = 0; j < img.getHeight(); j++) {
     
    		// recuperer couleur de chaque pixel
    		Color pixelcolor= new Color(img.getRGB(i, j));
     
    		// recuperer les valeur rgb (rouge ,vert ,bleu) de cette couleur
    		int r=pixelcolor.getRed();
    		int g=pixelcolor.getGreen();
    		int b=pixelcolor.getBlue();
     
    		// faire l'inversion
    		r=Math.abs(r-255);
    		g=Math.abs(g-255);
    		b=Math.abs(b-255);
     
     
    		//int rgb=new Color(r,g,b).getRGB();
    		int rgb=Color.YELLOW.getRGB();
     
    		// changer la couleur de pixel avec la nouvelle couleur inversée
    		img.setRGB(i, j, rgb);
     
    		}
    	}
    		// enregistrement d'image
    		ImageIO.write(img, "png",new File("C:\\Users\\scary\\Desktop\\carrem.png"));
     
    	} catch (Exception e) {
    		System.err.println("erreur -> "+e.getMessage());
    	}
     
    	System.out.println("fin");
    	}
    }

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Oui mais... Là c'est toute l'image que tu modifies. Je croyais qu'il fallait que ça marche avec une forme quelconque ?

    De plus, faire deux appels de méthode par pixel, heureusement que l'image est petite -_-°.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Oui c'est très petit comme image (59x53) et c'est une simple forme sur fond blanc dc j'ai fais en sorte de ne modifier que les pixel qui ne sont pas blanc. Je sais que ce n'est pas orthodoxe mais cela me suffit emplement pour ce dont je cherchais

    Mais merci de ton aide en tout cas

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

Discussions similaires

  1. Question sur les fonctions avec "TABLE" comme param. de retour
    Par Alex01 dans le forum Développement
    Réponses: 2
    Dernier message: 17/11/2008, 09h26
  2. [Gtkmm] question sur les Image
    Par supers03 dans le forum GTK+
    Réponses: 5
    Dernier message: 28/01/2008, 10h59
  3. question sur les images
    Par zulot dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 18/06/2007, 16h43
  4. Réponses: 5
    Dernier message: 15/05/2007, 14h53
  5. [Debutante][image]questions sur les images
    Par misstinkiete dans le forum 2D
    Réponses: 2
    Dernier message: 25/07/2005, 21h23

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