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

 Java Discussion :

Déterminer la couleur d'un pixel


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut Déterminer la couleur d'un pixel
    Bonjour,
    Ma question est double, comment se déplacer sur un pixel dans l'applet et déterminer sa couleur ?
    (noir si le pixel appartient au fond, vert s'il est dans le carré)
    Alain
    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
    import java.applet.Applet;
    import java.awt.Color;
    import java.awt.Graphics;
     
    public class Test extends Applet {
     
    	public void init() {
    		// Définir la couleur du fond de l'applet
    		setBackground(Color.black);
    	}
     
    	public void paint(Graphics g) {
    		// Définir la couleur vert
    		g.setColor(Color.green);
     
    		// Dessine un carré
    		g.fillRect(50, 50, 100, 100);
    	}
    }

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    merci Sébastien,
    J'ai testé le 2ème lien
    mon code génère une erreur
    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
    import java.applet.Applet;
    import java.awt.Color;
    import java.awt.Graphics;
     
    public class Test extends Applet {
     
    	public void init() {
    		// Définir la couleur du fond de l'applet
    		setBackground(Color.black);
    	}
     
    	public void paint(Graphics g) {
    		// Définir la couleur vert
    		g.setColor(Color.green);
     
    		// Dessine un carré
     
    		g.fillRect(50, 50, 100, 100);
    		int x = 100;
    		int y = 100;
    		int pixels[] = null;
    		int index = x * 1 + y;
     
    		int c = pixels[index]; // or pixels[x * width + y]
    		System.out.println(c);
     
    		int red = (c & 0x00ff0000) >> 16;
    		int green = (c & 0x0000ff00) >> 8;
    		int blue = c & 0x000000ff;
     
    		// and the Java Color is ...
    		Color color = new Color(red, green, blue);
    		System.out.println(color);
    	}
    }

  4. #4
    Membre chevronné Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Par défaut
    Quelle erreur ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par Mobius Voir le message
    Quelle erreur ?
    la ligne 26 est les erreurs sont
    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
    Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
    	at Test.paint(Test.java:26)
    	at sun.awt.RepaintArea.paintComponent(Unknown Source)
    	at sun.awt.RepaintArea.paint(Unknown Source)
    	at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int pixels[] = null;
    ...
    int c = pixels[index]; // or pixels[x * width + y]
    ha bah là c'est sûr, on assigne null et 2 lignes plus bas on cherche à accéder à la référence... c'est sûr que ça va pas marcher ^^

    le tableau pixel ne doit pas être null, il doit venir d'une image ==> cf mon 1er lien

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int pixels[] = null;
    ...
    int c = pixels[index]; // or pixels[x * width + y]
    ha bah là c'est sûr, on assigne null et 2 lignes plus bas on cherche à accéder à la référence... c'est sûr que ça va pas marcher ^^

    le tableau pixel ne doit pas être null, il doit venir d'une image ==> cf mon 1er lien
    Le tableau ne doit pas être null, mais moi je le suis, sniff
    Mes premiers pas en java sont (très) laborieux, je relis la dizaine de lignes du code et ma petite cervelle bogue.

    A la ligne int c = pixels[index]; "Eclipse" me suggère d'initialiser int pixels [] =null;

    Moi, bêtement j'accepte (et sans réfléchir) parce que je ne vois pas une autre solution.
    Alain

  8. #8
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    A ma connaissance tu peux pas récupérer le pixel d'un Graphics, mais on peut le faire à partir d'une Image (comme suggéré par Pill_S).

    Tu as une méthode getRGB qui te permet d'extraire un pixel d'une Image!

    Je te propose donc ceci

    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
    public class TestApplet extends Applet {
    	private static final long serialVersionUID = 1748168598860228572L;
    	private BufferedImage bufferedImage = null; 
     
    	public void init() {
    		setBackground(Color.black);
    	}
     
    	public void paint(Graphics g) {
    		// on créé l'image
    		this.bufferedImage = new BufferedImage(200, 200, BufferedImage.TYPE_4BYTE_ABGR);
    		Graphics2D graphics2D = this.bufferedImage.createGraphics();
     
    		// on dessine ici le rectangle vert
    		graphics2D.setColor(Color.green);
    		graphics2D.fillRect(50, 50, 100, 100);
     
    		// on dessine le tout
    		g.drawImage(this.bufferedImage, 0, 0, 200, 200, this);
     
    		int color = this.bufferedImage.getRGB(15, 15);
    		System.out.println(new Color(color));
     
    		color = this.bufferedImage.getRGB(55, 55);
    		System.out.println(new Color(color));
     
    		color = this.bufferedImage.getRGB(145, 145);
    		System.out.println(new Color(color));
     
    		color = this.bufferedImage.getRGB(185, 185);
    		System.out.println(new Color(color));
    	}
    }
    Si tu as des questions sur ce bout de code, n'hésite pas à les poser. Attention c'est un code qui sert d'exemple, c'est pas terrible de créer des objets dans une méthode paint.

    A+

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par billynirvana Voir le message
    A ma connaissance tu peux pas récupérer le pixel d'un Graphics, mais on peut le faire à partir d'une Image (comme suggéré par Pill_S)
    (...) Attention c'est un code qui sert d'exemple, c'est pas terrible de créer des objets dans une méthode paint.
    Enfin une solution pour bosser !
    Avec les premières explications proposées j'avais du mal à me représenter la solution.
    Pourquoi la méthode PAINT n'est pas terrible ?

  10. #10
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    L'instanciation d'un objet est une instruction couteuse.
    La méthode paint est appelée très souvent par un tas d'évènements: mouvement de souris, déplacement de la fenêtre, etc...

    Il faut donc réduire l'instanciation d'objets dans ce genre de méthode.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    Citation Envoyé par billynirvana Voir le message
    L'instanciation d'un objet est une instruction couteuse.
    La méthode paint est appelée très souvent par un tas d'évènements: mouvement de souris, déplacement de la fenêtre, etc...

    Il faut donc réduire l'instanciation d'objets dans ce genre de méthode.
    Bonjour,
    Ok pour ce conseil, dans ce cas quelle serait la méthode de substitution ?
    Alain

  12. #12
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Il n'y a pas de méthode de substitution, il faut designer son code afin de limiter le nombre d'objet instancie par paint. Plus globalement, paint fait partie des méthodes qui méritent d'être optimisées

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 333
    Par défaut
    merci pour ces éclaircissements, bonne journée
    Alain

  14. #14
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Par exemple dans ton cas il serait amplement préférable que la BufferedImage soit créée et modifiée en dehors de la méthode paint (d'ailleurs en Swing ce n'est pas paint qu'il faut redéfinir mais paintComponent).

    La méthode paintComponent ne doit en général ne contenir que des instructions ayant pour but de dessiner sur le composant, tout les éléments nécessaires ayant dû être préparés au préalable.

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

Discussions similaires

  1. Algo pour déterminer la couleur d'un objet
    Par Nath71 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 26/04/2005, 01h58
  2. Réponses: 1
    Dernier message: 26/03/2005, 12h31
  3. [TBitmap] Recuperer la couleur d un pixel
    Par DamessS dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/12/2004, 08h47
  4. [VB6] Comment récupérer la couleur d'un pixel de l'écran?
    Par Taurëndil dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 26/03/2004, 08h02
  5. Obtenir la couleur d'un pixel
    Par GLDavid dans le forum OpenGL
    Réponses: 2
    Dernier message: 09/03/2004, 18h21

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