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 :

Histogramme d'une image


Sujet :

2D Java

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut Histogramme d'une image
    Bonjour,

    je dessine un histogramme d'une image en utilisant ce 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class Histogramme extends JComponent {
     
       private static final long serialVersionUID = 1L;
       private BufferedImage image, histogramme;
       private final int largeur = 256;
       private final int hauteur = 200;
       private Graphics2D dessin;
       private final int[] rouge = new int[256];
       private final int[] vert = new int[256];
       private final int[] bleu = new int[256];
     
       public Histogramme(BufferedImage monImage){
          image = monImage;
          récupérerRVB();
          tracerHistogrammes();
       }
     
       protected void paintComponent(Graphics surface) {
         // surface.drawImage(image, 0, 0, null);  
          surface.drawImage(histogramme,100, 100, null);
       }
     
       private void récupérerRVB() {
          Raster trame = image.getRaster();
          int[] rgb = new int[3];
          int maximum = 0;
          for (int y=0; y<image.getHeight(); y++)
             for (int x=0; x<image.getWidth(); x++) {
                trame.getPixel(x, y, rgb);
                rouge[rgb[0]]++;
                vert[rgb[1]]++;
                bleu[rgb[2]]++;
             }          
       }
     
       private void tracerHistogrammes() {
          histogramme = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
          dessin = histogramme.createGraphics();
          Rectangle2D rectangle = new Rectangle2D.Double(0, 0, largeur-1, hauteur-1);
          dessin.draw(rectangle);
          dessin.setPaint(new Color(1F, 1F, 1F, 0.2F));
          dessin.fill(rectangle);     
          changerAxes();
          dessin.setPaint(new Color(1F, 0F, 0F, 0.4F));
          tracerHistogramme(rouge);
          dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
          tracerHistogramme(vert);
          dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
          tracerHistogramme(bleu);
       }
     
       private void changerAxes() {
          dessin.translate(0, hauteur);
          double surfaceImage = image.getWidth()*image.getHeight();
          double surfaceHistogramme = histogramme.getWidth()*histogramme.getHeight();
          dessin.scale(1, -surfaceHistogramme/surfaceImage/3.7);     
       }  
     
       private void tracerHistogramme(int[] couleur) {
          for (int i=0; i<255; i++)
             dessin.drawLine(i, 0, i, couleur[i]);             
       }

    Ma question est je veux afficher les valeurs de celui ci, genre le max le zero le 255 !! Et j'en ai aucune idée

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si c'est comment écrire des caractères que tu voudrais savoir, il suffit d'utiliser la méthode drawString() de la classe Graphics.

    Par exemple : dessin.drawString(String.valueOf(max), x, y); (attention, y est l'ordonnée de la base line). En revanche, comme tu changes la transformée affine de ton contexte graphique, il faudra restituer l'identité (dessin.setTransform(new AffineTransform());) sinon tu vas écrire à l'envers, sans parler de la déformation.

    Par ailleurs, pense à toujours libérer un contexte graphique après avoir dessiner dedans, en appelant dispose() : dessin.dispose(); à la fin de ta méthode traceHistogrammes().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    comme je suis débutant j'ai pas bien compris enfaite par exemple pour ajouter les valeurs de 0 à 255 je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dessin.drawString(String.valueOf(255), x, y);
    Je remplace x et y par quoi ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 980
    Points
    7 980
    Par défaut
    X et Y sont les coordonées ou la méthode va dessiner le texte tout simplement. (Il suffit d'aller voir la doc de la méthode...)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    Je sais que le forum est un peu ancien mais je reviens vers vous pour un nv problème.
    Apres avoir dessiner l'histogramme j'utilise un jslider enfaite je fais en sorte qu'il dessine pas l'histogramme si les valeurs sont inferieurs aux valeurs du slider
    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
     private void tracerHistogramme(int[] couleur) {
     
         // String selected = "none";
     
      	 javax.swing.event.ChangeEvent e = null;
      	  for (int i=0; i<255; i++) {
      		for (int j=0; j<255; j++) {	
      		int value = ((javax.swing.JSlider)(e.getSource())).getValue();
      		int rgb = image.getRGB(i,j);
      		if((rgb&0xff) < value){
     
     
      			dessin.drawLine(0, 0, 0, 0); }
      		else if ((rgb&0xff) > value){
      		dessin.drawLine(i, 0, i, couleur[i]);  
      			}
     
      		}
    mais j'ai une erreur qui est nullpointer, je sais que mon e=null mais je sais pas quoi faire du coup Pouvez vous m'aider svp

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Comme tous les composants Swing de type interactif, un JSlider est évenementiel : on enregistre un écouteur qui va écouter les évenements et réagir au moment où l'évenement sera reçu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    jslider.addChangeListener(new ChangeListener() {
     
    public void stateChanged(ChangeEvent e) {
        JSlider source = (JSlider)e.getSource();
        if (!source.getValueIsAdjusting()) {
            int value = (int)source.getValue();
            // ici on appelle la méthode qui provoque le (re)dessin de l'histogramme
        }
    }
     
    });
    Par exemple, avec le code initial (que j'ai corrigé par ailleurs) que tu as indiqué (parce que le dernier me semble douteux, avec cette boucle sur les pixels d'une image...)


    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    public class Histogramme extends JComponent {
     
       private static final long serialVersionUID = 1L;
       private BufferedImage image, histogramme;
       private final int largeur = 256;
       private final int hauteur = 200;
       private final int[] rouge = new int[256];
       private final int[] vert = new int[256];
       private final int[] bleu = new int[256];
     
       private int minBleu; // la valeur de seuil pour le bleu
       private int minRouge; // la valeur de seuil pour le rouge
       private int minVert; // la valeur de seuil pour le vert
     
       public Histogramme(BufferedImage monImage){
          image = monImage;
          récupérerRVB();
          tracerHistogrammes();
       }
     
       public void setMinBleu(int minBleu) {
              this.minBleu=minBleu;
              repaint(); // provoque un redessin
       }
     
       public void setMinRouge(int minRouge) {
              this.minRouge=minRouge;
              repaint(); // provoque un redessin
       }
     
       public void setMinVert(int minVert) {
              this.minVert=minVert;
              repaint(); // provoque un redessin
       }
     
       protected void paintComponent(Graphics surface) {
         // surface.drawImage(image, 0, 0, null);  
          surface.drawImage(histogramme,100, 100, null);
       }
     
       private void récupérerRVB() {
          Raster trame = image.getRaster();
          int[] rgb = new int[3];
          int maximum = 0;
          for (int y=0; y<image.getHeight(); y++)
             for (int x=0; x<image.getWidth(); x++) {
                trame.getPixel(x, y, rgb);
                rouge[rgb[0]]++;
                vert[rgb[1]]++;
                bleu[rgb[2]]++;
             }          
       }
     
       private void tracerHistogrammes() {
          histogramme = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
          Graphics2D dessin = histogramme.createGraphics();
          Rectangle2D rectangle = new Rectangle2D.Double(0, 0, largeur-1, hauteur-1);
          // ne sert strictement à rien dessin.draw(rectangle);
          dessin.setPaint(new Color(1F, 1F, 1F, 0.2F));
          dessin.fill(rectangle);     
          changerAxes(dessin);
          dessin.setPaint(new Color(1F, 0F, 0F, 0.4F));
          tracerHistogramme(dessin, rouge, minRouge);
          dessin.setPaint(new Color(0F, 1F, 0F, 0.4F));
          tracerHistogramme(dessin, vert, minVert);
          dessin.setPaint(new Color(0F, 0F, 1F, 0.4F));
          tracerHistogramme(dessin, bleu, minBleu);
          dessin.dispose(); // toujours disposer après utilisation
       }
     
       private void changerAxes(Graphics2D dessin) {
          dessin.translate(0, hauteur);
          double surfaceImage = image.getWidth()*image.getHeight();
          double surfaceHistogramme = histogramme.getWidth()*histogramme.getHeight();
          dessin.scale(1, -surfaceHistogramme/surfaceImage/3.7);     
       }  
     
       private void tracerHistogramme(Graphics2D dessin, int[] couleur, int min) {
          for (int i=0; i<255; i++)
             if ( couleur[i]>min ) { // par exemple (je ne sais pas en quoi la valeur du slider est censée intervenir dans ton dessin, mais ça ressemble à ça dans ton dernier code)
                dessin.drawLine(i, 0, i, couleur[i]);             
             }
     
          }
       }
    Ensuite dans le prog principal, tu as
    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
    public static void main(Strng[] args) {
     
         /*...*/
     
         Histogramme histo = new Histogramme( image ) ;
     
         JSlider sliderRouge = new JSlider(...);
         JSlider sliderVert = new JSlider(...);
         JSlider sliderBleu = new JSlider(...);
     
         sliderBleu.addChangeListener(new ChangeListener() {
                 JSlider source = (JSlider)e.getSource();
                 if (!source.getValueIsAdjusting()) {
                    int value = (int)source.getValue();
                    histo.setMinBleu(value);
                }
         });
         sliderVert .addChangeListener(new ChangeListener() {
                 JSlider source = (JSlider)e.getSource();
                 if (!source.getValueIsAdjusting()) {
                    int value = (int)source.getValue();
                    histo.setMinVert(value);
                }
         });
         sliderRouge.... pareil...
     
         /*...*/
    }
    ou plus simple avec les lambdas en java 8 :
    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
    public static void main(Strng[] args) {
     
         /*...*/
     
         Histogramme histo = new Histogramme( image ) ;
     
         JSlider sliderRouge = new JSlider(...);
         JSlider sliderVert = new JSlider(...);
         JSlider sliderBleu = new JSlider(...);
     
         sliderBleu.addChangeListener(e-> histo.setMinBleu(sliderBleu.getValue());
         sliderVert.addChangeListener(e-> histo.setMinVert(sliderVert.getValue());
         sliderRouge.addChangeListener(e-> histo.setMinRouge(sliderRouge.getValue());
     
         /*...*/
    }
    }



    On peut fonctionner en mode non évenementiel en récupérant la valeur directement jslider.getValue() mais bien sûr cela ne fonctionnera que si le silder est affiché, et que l'utilisateur le bouge, avant l'histogramme, et tout changement dans le slider ensuite n'aura aucun effet.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Merci, super je passe en résolu !!
    Enfaite derniere question avant celle ci y'a t'il un moyen d'afficher la valeur max dans le dessin même?

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par YOUHANA Voir le message
    Enfaite derniere question avant celle ci y'a t'il un moyen d'afficher la valeur max dans le dessin même?
    J'ai déjà répondu à ça : avec drawString... pour afficher du texte. Je ne sais pas de quelle valeur max tu parles, mais par exemple, dans le programme suivant, j'affiche un histogramme avec la valeur de chaque barre écrite au-dessus :
    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
    public class ExempleHisto extends JPanel {
     
    	private final BufferedImage image;
     
    	public ExempleHisto() {
    		// remplissage histo
    		final Color[] colors = {Color.RED, Color.BLUE, Color.ORANGE, Color.PINK, Color.YELLOW, Color.CYAN, Color.MAGENTA, Color.GREEN};
    		image = new BufferedImage(colors.length*32+10*2,300+10*2, BufferedImage.TYPE_INT_ARGB);
    		final Graphics2D g = image.createGraphics();
     
    		final Random random = new Random();
    		for(int i = 0; i<colors.length; i++) {
    			g.setColor(colors[i]);
    			int h=random.nextInt(300)+10;
    			int x = 10 + i*32;
    			int y = image.getHeight()-10-h;
    			g.fillRect(x, y, 32, h);
    			g.setColor(Color.BLACK);
    			g.drawString(String.valueOf(h), x, y-10);
    		}
     
    		g.dispose();
     
     
    		setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		g.drawImage(image, 0, 0, null);
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.add(new ExempleHisto());
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
     
    }
    ça c'est la base... ensuite, pour placer précisemment le texte (le centrer par exemple par rapport aux barres dans mon exemple), c'est un peu plus compliqué. J'ai fait une méthode pour simplfier ça en plaçant une texte par rapport à un rectangle :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    public class ExempleHisto extends JPanel {
     
    	private final BufferedImage image;
     
    	public ExempleHisto() {
    		// remplissage histo
    		final Color[] colors = {Color.RED, Color.BLUE, Color.ORANGE, Color.PINK, Color.YELLOW, Color.CYAN, Color.MAGENTA, Color.GREEN};
    		image = new BufferedImage(colors.length*32+10*2,300+10*2+15, BufferedImage.TYPE_INT_ARGB);
    		final Graphics2D g = image.createGraphics();
     
    		g.setFont(g.getFont().deriveFont(8));
     
    		final Random random = new Random();
    		for(int i = 0; i<colors.length; i++) {
    			g.setColor(colors[i]);
    			int h=random.nextInt(300)+10;
    			int x = 10 + i*32;
    			int y = image.getHeight()-10-h;
    			g.fillRect(x, y, 32, h);
    			g.setColor(Color.BLACK);
    			drawText(g, new Rectangle(x,y-15,32,15), String.valueOf(h), SwingConstants.CENTER, SwingConstants.CENTER);
    		}
     
    		g.dispose();
     
     
    		setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		g.drawImage(image, 0, 0, null);
    	}
     
    	/**
             * Ecrit un texte placé dans un rectangle
             * 
             * @param g2d le contexte graphique
             * @param bounds le rectangle dans lequel placer le texte
             * @param string le texte
             * @param halign l'alignement horizontal du texte ({@link SwingConstants.CENTER}, {@link SwingConstants.LEFT}, {@link SwingConstants.RIGHT}) 
             * @param valign l'alignement vertical du texte ({@link SwingConstants.CENTER}, {@link SwingConstants.TOP}, {@link SwingConstants.BOTTOM})
             */
    	public static void drawText(final Graphics2D g2d, final Rectangle2D bounds, final String string, int halign, int valign) {
     
    		final FontMetrics fontMetrics = g2d.getFontMetrics();
     
    		final Rectangle2D textBounds = fontMetrics.getStringBounds(string, g2d);
     
    		final double textWidth = textBounds.getWidth();
     
    		final double x,y;
     
    		switch (halign) {
    		case SwingConstants.LEFT:
    			x = bounds.getX();
    			break;
    		case SwingConstants.RIGHT:
    			x = bounds.getX() + bounds.getWidth() - textWidth;
    			break;
    		case SwingConstants.CENTER:
    		default:
    			x = bounds.getX()
    			+ (bounds.getWidth() - textWidth) / 2;
    			break;
    		}
    		switch (valign) {
    		case SwingConstants.TOP:
    			y = bounds.getY() + fontMetrics.getAscent() - fontMetrics.getDescent();
    			break;
    		case SwingConstants.BOTTOM:
    			y = bounds.getY()
    			+ bounds.getHeight()  - fontMetrics.getDescent() ;
    			break;
    		case SwingConstants.CENTER:
    		default:
    			y = bounds.getY()
    			+ bounds.getHeight()/ 2  - ( ( fontMetrics.getAscent() + fontMetrics.getDescent() ) / 2 ) + fontMetrics.getAscent()  ;
    			break;
    		}	 
     
     
    		g2d.drawString(string, (int)x, (int)y);
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.add(new ExempleHisto());
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Ah d'accord je vois mieux mnt ou est ce mon erreur mercii !
    Enfaite avec mon code que j'avais fais et que vous m'avez corrigez quand j'essaye avec des images de petites tailles celle là par exemple
    Nom : IMG15.PNG
Affichages : 1471
Taille : 573 octets

    et que j'essaye d'afficher l'histogramme il me fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3
    que me conseillez vous ?

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par YOUHANA Voir le message
    que me conseillez vous ?
    Premièrement de toujours montrer la stacktrace de l'erreur complète, de manière à avoir un maximum d'informations sur l'erreur, et la ligne correspondant dans le code n'est pas complètement inutile non plus.

    Ensuite, je pense que le problème ne vient pas de la taille de l'image (et n'a rien à voir avec les modifications du code que j'ai faites, qui ne concerne que la portée de la variable de type Graphics2D dessin et de sa disposition), mais vient du fait que tu accèdes au sample dans le Raster avec un tableau à 3 positions, alors qu'une image avec un alpha en RGB a 4 composantes (comme déjà dit dans un autre post) dans le modèle, et qu'il peut même y avoir des modèles à 2 composantes, ou à 6 ou à n'importe, selon le type d'image. Passer par le Raster/SampleModel impose de tenir compte de ça (pourquoi passer par le Raster, alors que tu utilisais la méthode getRGB() directement sur l'image jusqu'ici ?) . Si tu n'as pas eu le problème jusqu'ici, c'est que tu as dû faire des tests avec des images en RGB, et non ARGB (des JPEG par exemple, alors que là c'est un PNG).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Merci, alors si j'ai bien compris vous me conseillez d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      for (int y=0; y<image.getHeight(); y++)
    	         for (int x=0; x<image.getWidth(); x++) {
    	        	 int trame = image.getRGB(x, y);
    	            trame.getPixel(x, y, rgb);
    	            rouge[rgb[0]]++;
    	            vert[rgb[1]]++;
    	            bleu[rgb[2]]++;
    	         }

    Au lieu de passer à 4 valeurs du tableau vu que l'image peut être de plusieurs type ? Vous me corrigez si je me trompe svp !

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par YOUHANA Voir le message
    Au lieu de passer à 4 valeurs du tableau vu que l'image peut être de plusieurs type ? Vous me corrigez si je me trompe svp !
    Oui, sauf que tu ne vas pas obtenir un tableau du coup, donc rgb[] ne peut plus être utilisé directement. Il faut le remplir pour ça. Tu peux utiliser cette méthode pour générer le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int[] toArray(int argb) {
     
       int[] array = new int[3];
     
       array[0] = (argb >> 16 ) & 0xff;
       array[1] = (argb >> 8 ) & 0xff;
       array[2] = argb & 0xff;
     
       return array;
     
     
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public int[] toArray(int argb) {
     
    		   int[] array = new int[3];
     
    		   for(int i=0; i<3; i++) {
    			   array[i] = (argb >> (2-i)*8 ) & 0xff;
    		   }
     
    		   return array;
     
     
    		}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void récupérerRVB() { 
          int maximum = 0;
          for (int y=0; y<image.getHeight(); y++)
             for (int x=0; x<image.getWidth(); x++) {
                int[] rgb = toArray(image.getRGB(x, y));
                rouge[rgb[0]]++;
                vert[rgb[1]]++;
                bleu[rgb[2]]++;
             }          
       }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Merci beaucoup !

  14. #14
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Je ne sais pas de quelle valeur max tu parles
    Bonjour,
    Je vous remercie pour votre retour,
    Enfaite la valeur max que je veux afficher dans mon historgramme par exemple voilà mon histogramme

    Nom : Capture.PNG
Affichages : 1565
Taille : 3,6 Ko

    C'est la valeur cocher en rouge !!

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Déjà, il faudrait le calculer le max ! Tu traces trois histogrammes, un pour le rouge, un pour le vert et un pour le bleu. Tu traces le vert et le bleu avec un alpha de 0, donc ils sont invisibles : c'est quoi le but ? Au passage, pourquoi créer une image avec transparence, si c'est pour remplir le fond ?

    Donc pour calculer le max de chaque composante, il te faut trois variables de classe, mettons maxRouge, maxVert et maxBleu, et tu fais une méthode qui calcule le max d'un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private int max(int[] array) {
         int max=0;
         for(int i : array) {
             max = Math.max(i,max);
         }
         return max;
    }
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private int max(int[] array) {
         return Arrays.stream(array).max().orElse(0);
    }

    Puis tu l'appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public Histogramme(BufferedImage monImage){
    	      image = monImage;
    	      recupererRVB();
                  maxRouge = max(rouge);
                  maxVert = max(vert);
                  maxBleu = max(bleu);
    	      tracerHistogrammes();
    	   }
    Puis tu modifies ta méthode de dessin, pour pouvoir traiter le max :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void tracerHistogramme(Graphics2D dessin, int[] couleur, int min, int max) {
    	      for (int i=0; i<255; i++)
    	         if ( couleur[i]>min ) { 
    	            dessin.drawLine(i, 0, i, couleur[i]);             
                        if ( couleur[i]==max ) {
     
                             // ici on est en train de tracer la ligne qui correspond au max
                             // on va dessiner la valeur du max (appel de dessin.drawString( String.valueOf(max), x, y)) a toi de déterminer le x et le y (voir ce que je t'ai déjà indiqué)
     
                        }
    	         }
     
    	      }
    	   }
    Et tu modifies l'appel dans tracerHistogrammes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tracerHistogramme(dessin, rouge, minRouge, maxRouge);
    Idem pour le vert et le bleu.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Merci beaucoup !! autre questions, y'a t'il un moyen de calculer le nombre de point ? Dans mon histogramme l'addition des nombre des valeurs de chaque barres
    ?

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui, d'une façon similaire au max :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private int sum(int[] array) {
         int sum=0;
         for(int i : array) {
             sum += i ;
         }
         return sum;
    }
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private int sum(int[] array) {
       return Arrays.stream(array).reduce((sum,i)->sum+i).orElse(0)
    }
    Si tu dois exclures les valeurs en-dessous de min (comme pour le tracé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private int sum(int[] array, int min) {
         int sum=0;
         for(int i : array) {
             if ( i>min ) sum += i ;
         }
         return sum;
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private int sum(int[] array, int min) {
       return Arrays.stream(array).filter(i->i>min).reduce((sum,i)->sum+i).orElse(0)
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Merci dernière chose, J'essaye d'afficher la position du max , je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( couleur[i]==max ) {
    	        	 System.out.println("Le max = "    +max); 
    	        	 System.out.println("i  "  +i);
     
    	         }
    Mais la position est toujours à 0 !!

  19. #19
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La position ? i tu veux dire ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  20. #20
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 185
    Points : 64
    Points
    64
    Par défaut
    Oui la position du max , le i normalement non ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Egalisation de histogramme pour une image
    Par mihaispr dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 19/03/2009, 09h58
  2. problème d'affichage de l'histogramme d'une image
    Par tuunisiano dans le forum Simulink
    Réponses: 0
    Dernier message: 18/03/2009, 15h12
  3. Génération de l'histogramme d'une image
    Par Jrihab dans le forum Graphisme
    Réponses: 1
    Dernier message: 14/12/2008, 19h27
  4. Histogramme d'une image BMP en niveaux de gris?
    Par bahiatoon dans le forum C++Builder
    Réponses: 13
    Dernier message: 19/11/2008, 16h36
  5. histogramme d'une image coloré
    Par kachaloarmin dans le forum Imagerie
    Réponses: 1
    Dernier message: 13/11/2007, 19h49

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