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 :

problème dans le traitement des couleurs


Sujet :

Graphisme Java

  1. #1
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut problème dans le traitement des couleurs
    bonjour, voilà j'ai un problème. Je dois récupérer pour chaque pixel d'une image son code HSB. Bon tout va bien au début puisqu'en fait je dois d'abord récupérer pour chaque pixel son code RGB puis on me demande, pour chaque pixel, de récupérer sa couleur ( via un pixelgrabber), et la convertir en HSB. (via RGBtoHSB)

    Et là, je dois dire que je perds un peu dans tous les paramètres présents bref je m'en sors pas. Voilà je vous poste mon code, je ne m'attends pas à ce que vous me donniez le code résultat mais plutôt si vous pouviez, m'expliquer la démarche à suivre pour que je m'en sorte

    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
     
    public class LectureImage 
    {
     
    	protected URL url;
    	public LectureImage(URL url)
    	{
    		this.url=url;
    	}
     
    	public Image Connection()
    	{
    		try
    		{
    			URLConnection urlC= url.openConnection();
    			System.out.println(url);
    			//Accès au toolkit
    			java.awt.Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
    			//lecture de l'image
    			Image image = toolkit.getImage(url);
    			//On s'assure que l'image est complètement chargée
    			image = new ImageIcon(image).getImage();
    			BufferedImage bufferedImage = new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB );
    			//Lecture de tous les pixels
    			int w = bufferedImage.getWidth();
    			int h = bufferedImage.getHeight();
    			int[] rgbs = new int[w*h];
    			//On crée l'espace neccessaire
    			bufferedImage.getRGB(0,0,w,h,rgbs,0,w);
     
    			//c'est ici où en fait je ne sais pas quoi faire avec le pixelGrabber et surtout le problème de typage car RGBtoHSB souhaite un tableau de float alors que je travaille que sur des int pour le RGB
    			return image;
    		}
    		catch (IOException e)
    		{
    			e.printStackTrace();
    			return null;
    		}
    	}
    }

    Voilà j'espère que vous aurez quelques instants à me consacrer. merci à tous et bonnes fêtes au passage

  2. #2
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Color couleur=new Color(rgbs[indice]);
    float[] hsb = Color.RGBtoHSB(couleur.getRed(),couleur.getGreen(),couleur.getBlue(),null);
    pour récupéré la couleur hsb.
    hsb[0]: Teinte
    hsb[1]: Saturation
    hsb[2]: Luminosité

  3. #3
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    ok merci beaucoup de ton aide mais bon de cette façon je n'utilise pas le pixelGrabber. Fin bon c'est plus simple c'est sur et surtout ça marche

    S'il y en a qui ont des idées avec le pixelGrabber je suis preneur quand même pour ma culture générale

  4. #4
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Ton code reste inchangé, tu rajoute juste ces lignes dans une boucle après ta méthode getRGB(); l'indice correspond au numéro de pixel. Ensuite ça dépend de ce que tu veux faire de ta couleur hsb.

  5. #5
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    ensuite je dois dresser un histogramme des différentes teintes donc de hsb[0] donc maintenant reste plus qu'à construire un histogramme


    Si je résume bien j'ai créé un tableau de float hsb pour chaque pixel c'est ça?

    Donc en plus dans ma boucle, il faut que je stocke le hsb[0] dans un autre élément pour pouvoir après pour chaque pixel, atteindre sa teinte non?

  6. #6
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    exactement, tu dois juste les stocker dans un autre tableau, histoire de pas récrire dessus à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    float[][] hsbs=new float[][w*h];// là je suis plus sur de la notation...
    Color couleur;
    ...
    for(int indice=1;indice<=w*h;indice++)
    {
      couleur=new Color(rgbs[indice-1]);
     hsbs[indice-1] = Color.RGBtoHSB(couleur.getRed(),couleur.getGreen(),couleur.getBlue(),null);
     }
    en même temps, si tu n'a besoin que de la teinte, pas besoin de te compliquer la vie, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    float[] teinte=new float[w*h];// là je suis plus sur de la notation...
    Color couleur;
    ...
    for(int indice=1;indice<=w*h;indice++)
    {
      couleur=new Color(rgbs[indice-1]);
     teinte[indice-1] = (Color.RGBtoHSB(couleur.getRed(),couleur.getGreen(),couleur.getBlue(),null))[0];
     }

  7. #7
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    ok voilà avec le dernier bout de code que tu cites c'est clair que ça me suffit largement et ça m'évite de me trimballer avec un autre tableau. ben jte remercie beaucoup de ton aide et si tu as des idées pour contruire un histogramme je suis preneur aussi.

  8. #8
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Ben là c'est plus "trop dur", c'est "juste" du dessin. Tu dérive la classe JPanel, tu redéfinis la méthode paintComponent et grâce aux teintes que tu viens de récupérer tu peux dessiner ton histogramme. (Je te conseille de commencer sans dessiner les axes). 8)

  9. #9
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    c'est là que le bas blesse ça te parait simple mais bon comme j'ai jamais trop fait de graphique en java that's not so easy

    en plus jviens de penser avant d'ajouter à mon tableau de float la teinte je devrais vérifier si je ne l'ai pas déjà pour éviter les doublons et surtout alourdir l'histogramme pour rien

  10. #10
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Non, tu va voir, c'est simple :

    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
    private float[] teinte;
    private int largeurBarres;
     
    @Override public void paintComponent(Graphics g)
    {
    super.paintComponent(g);
    Graphics2D g2D=(Graphics2D) g;
    ...
    for(int i=1;i<=teinte.length;i++)
      {
      g2D.drawRect((i-1)*largeurBarres,0,largeurBarres,teinte[i-1]);
      }
    ...
     
    }
    Je te garantis pas que c'est correcte, mais ça donne une idée de comment procéder.

  11. #11
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    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
    int[] rgbs = new int[w*h];
    			//On crée l'espace neccessaire
    			int [] tabPix=bufferedImage.getRGB(0,0,w,h,rgbs,0,w);
    			Color couleur;
    			float[] teinte=new float[tabPix.length];
    			boolean ajout=true;
    			float testDoublon;
    			//parcours de mon tableau de pixels
    			for(int i=0;i<tabPix.length;i++)
    			{
    				couleur=new Color(tabPix[i]);
    				//permet de récupérer directement la teinte d'un pixel
    				//teinte[0] : teinte du pixel
    				//hsb[1]: Saturation
    				//hsb[2]: Luminosité
    /* test ici pour éviter les doublons
    ///////////////////////////////////////////////////////////////////////////				
    testDoublon = (Color.RGBtoHSB(couleur.getRed(),couleur.getGreen(),couleur.getBlue(),null))[0];
    				int j=0;
    				while (j<=i)
    				{
    					if (teinte[j]==testDoublon)
    					ajout=false;
    					else j++;
    				}
    				if(ajout==true)
    				{
    					teinte[i]=testDoublon;
    				}
    ////////////////////////////////////////////////////////////////////////////////
    			}
    Apparemment le test tourne en boucle jvois pas trop d'où ca vient

  12. #12
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    normal, remplace le "j<=i" par "j<i" et ça devrait fonctionner. Sinon, tu compare le pixel actuel avec lui même et tu incrémente pas j, donc logique.

  13. #13
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    ca ne fonctionne pas malgré la modification du test. Voilà le code après modif

    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
    Color couleur;
    			float[] teinte=new float[tabPix.length];
    			boolean ajout=true;
    			float testDoublon;
    			//parcours de mon tableau de pixels
    			for(int i=1;i<tabPix.length-1;i++)
    			{
    				couleur=new Color(tabPix[i-1]);
    				//permet de récupérer directement la teinte d'un pixel
    				//teinte[0] : teinte du pixel
    				//hsb[1]: Saturation
    				//hsb[2]: Luminosité
    				testDoublon = (Color.RGBtoHSB(couleur.getRed(),couleur.getGreen(),couleur.getBlue(),null))[0];
    				for (int j=0;j<i;j++)
    				{
    					if (teinte[j]==testDoublon)
    					ajout=false;
    				}
    				if(ajout==true)
    				{
    					teinte[i]=testDoublon;
    				}
     
    			}

  14. #14
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Qu'est-ce qui se passe? Essaye d'afficher la teinte et le test, fait des affichages au divers embranchements pour tracer ton code.

  15. #15
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    il rentre jamais ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(ajout==true)
                {
                   teinte[i]=testDoublon;
                }
    Il ne me rajoute jamais une teinte donc il ne fait jamais teinte[j]=testDoublon

    ce test là rate :

    Ou alors c'est mal initialisé et ça rate dès le premier coup et ensuite ça s'arrete pas

  16. #16
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Essaye d'afficher ton teste "teinte[j]==testDoublon" et son résultat, et place le ajout=false entre {} on sait jamais...

  17. #17
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Je crois que je l'ai, tu dois faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int j=0;j<i-1;j++)// ici i-1 au lieu de i
                {
                   if (teinte[j]==testDoublon)
                   ajout=false;
                }
    sinon c'est le même problème qu'avant.
    Ton premier i vaut 1 ton premier j vaut 0 donc au teste j<i il va dire true alors qu'on ne voudrait pas tester ce pixel là.

  18. #18
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    apparemment le testDoublon vaut toujours zéro mais même ca boucle toujours c'est vraiment bizarre et malgré ta modif ca tourne toujours pas

    Ca vient de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    testDoublon = (Color.RGBtoHSB(couleur.getRed(),couleur.getGreen(),couleur.getBlue(),null))[0];

  19. #19
    Membre actif Avatar de aDamas
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2004
    Messages : 260
    Points : 288
    Points
    288
    Par défaut
    Fait-il plusieurs fois la boucle principale? Dans laquelle des deux boucle reste-il bloqué?
    si tu affiche la couleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(couleur);
    après le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     couleur=new Color(...);
    il te dit quoi?

  20. #20
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    il écrit ça dans la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.awt.Color[r=0,g=0,b=0]
    Autant de fois que j'ai de pixels dans mon tabPix.

    En fait, je pense pas qu'il plante, c'est juste qu'il effectue toutes les comparaisons et c'est long enfin j'espère que c'est ça

    Donc dès le début il me récupère aucune couleur pour mon pixel

    heeeeeeeeeeeeelllp

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

Discussions similaires

  1. Problème: formulaire et traitement des données
    Par Pahcixam dans le forum Langage
    Réponses: 3
    Dernier message: 29/10/2006, 04h37
  2. [AJAX] Traitement des balises html
    Par Mysti¢ dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/08/2006, 22h07
  3. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  4. Problème dans le calcul des normales moyennes,
    Par MaxPayne dans le forum OpenGL
    Réponses: 1
    Dernier message: 12/04/2005, 17h50
  5. [ORACLE 9.2] Problème dans le Manager des tâches Win
    Par vempiria dans le forum Oracle
    Réponses: 25
    Dernier message: 12/10/2004, 09h30

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