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

Windows Discussion :

Couleur Pixel


Sujet :

Windows

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Couleur Pixel
    Bonjour ^^

    J'aimerais un peu d'aide pour obtenir la couleur d'un pixel.

    Mon code pour le moment ressemble à cela, il marche mais cela ralentit énormement l'ordinateur :<

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(blabla == 1)
    {
     nColor = GetPixel(hScreenDC, 50, 50);
    
         if (nColor == rouge)
          {
          // n'importe quel action
          blabla = 2
          }
     }
    Si quelqu'un avait un exemple ou une explication permettant de remplacer la fonction GetPixel() cela serait parfait ^^

    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Attention, ici, je ne parle pas de DirectX, car je ne connais pas.

    Pour lire directement un pixel de l'écran, tu ne peux rien faire de plus rapide.
    Par contre, pour lire un nombre élevé de pixels d'une image capturée, tu peux: Il te suffit de créer une DIB (Device-Independent Bitmap), et tu auras un accès direct à sa mémoire. Donc, après y avoir copié l'écran...

    Fonctions qui te seront nécessaires:
    • CreateDIBSection() pour créer ta DIB au format que tu veux (je te conseille 32 bits)
    • CreateCompatibleDC() et BitBlt() pour la capture
    • DeleteDC() et DeleteObject() pour le nettoyage.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Ça me parait quand même bizarre que je ne suis puisse pas faire cela plus rapidement qu'avec GetPixel().

    Par contre, pour lire un nombre élevé de pixels d'une image capturée, tu peux: Il te suffit de créer une DIB (Device-Independent Bitmap), et tu auras un accès direct à sa mémoire. Donc, après y avoir copié l'écran...
    Est-ce utile dans mon cas ?

    Cela voudrai dire que j'ai a recapturer l'image en boucle pour pouvoir faire la comparaison ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Mais je ne sais pas ce que tu veux!
    Si c'est pour comparer complètement deux images, la copie vers une DIB est toute indiquée, car tu peux ensuite accéder rapidement à la valeur d'un pixel grâce au pointeur qui mène directement dans la mémoire du bitmap.

    Si tu veux juste tester un seul pixel à chaque fois dans l'image, ben je ne vois pas plus rapide que GetPixel(). D'un autre côté, je ne connais pas DirectX, donc j'ignore si ça pourrait t'aider...

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Oui j'ai juste besoin de tester 1 seul pixel.

    Mon but est de savoir le plus rapidement possible quand un pixel donner change de couleur.

    Est t'il par exemple possible d'obtenir un pointeur sur l'adresse de la mémoire où est stocker la valeur de ce pixel ? de façon a pouvoir vérifier si sa valeur a changer rapidement sans repasser par GetPixel() ni recréer un bitmap a chaque fois ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ça, je sais que c'est impossible sans DirectX : Pas moyen de toucher directement à l'écran.
    Et je ne sais même pas si on peut le faire avec DirectX...

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Et donc pense tu que l'utilisation de CreateCompatibleDC() ect.. soit plus rapide que GetPixel() pour 1 seul pixel ?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Non, pour un seul pixel ça sera encore plus lent.

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 385
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 385
    Points : 20 463
    Points
    20 463
    Par défaut
    Salut Heyyoye il faut utiliser les méthodes de Médinoc créer des D.I.B. bitmaps et appeler GetDibBits .
    GetDIBits
    The GetDIBits function retrieves the bits of the specified compatible bitmap and copies them into a buffer as a DIB using the specified format.
    Regarder dans le MSDN..

    Je ne sais pour quelles raisons mais GetPixel et surtout SetPixel sont très lentes..
    C'est une fonction du GDI et je pense que Windows est obligé à chaque fois de convertir le format de pixel ou bien d'aller lire dans la mémoire vidéo alors que GetDIBits est plus linéaire.
    Pour Direct X on n'a accés qu'à des DirectDraw Surface qui représentent en fait la mémoire vidéo...
    Mais Direct X est parallèle au GDI il faut basculer dans ce mode là l'accès aux controles est plus lent
    Que veux-tu faire au final ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour lire un seul pixel à chaque fois, je pense que copier toute l'image dans une DIB sera plus lent, non?
    Ou bien GetPixel() est à ce point lente?

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Que veux-tu faire au final ?
    Rien de special, seulement obtenir la couleur pour pouvoir la comparer rapidement =)


    Pourrait tu me montrer brièvement comment utiliser GetDibBits car j'ai un peu de mal a comprendre et msdn manque d'explications

  12. #12
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 385
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 385
    Points : 20 463
    Points
    20 463
    Par défaut
    @Medinoc GetDIBits est peut-être plus bas-niveau
    Seuls les pontes de Microsoft le savent
    Faudrait poser la question à Raymond Chen
    @heyyoye
    Chercher dans Google "Storing an Image"
    http://msdn.microsoft.com/en-us/libr...40(VS.85).aspx

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Oui j'étais tombé sur cette page en faisant mes recherches mais je t'avoue ne pas du tout comprendre le fonctionnement :<

    Mais merci quand même pour m'avoir mis sur la piste, je finirai bien par réussir

Discussions similaires

  1. [XL-2003] Couleur pixel d'une image
    Par roro69 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/06/2015, 06h59
  2. Modifier couleur pixel - PictureBox
    Par rousseau_damien dans le forum C#
    Réponses: 3
    Dernier message: 06/02/2011, 17h01
  3. Colorier couleur pixel
    Par PA-42 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 22/12/2009, 23h11
  4. optimisation, lecture couleur pixel image
    Par mdr_cedrick dans le forum Langage
    Réponses: 5
    Dernier message: 17/10/2008, 15h44
  5. Recherche occurences couleur pixel
    Par BATiViR dans le forum Langage
    Réponses: 11
    Dernier message: 26/08/2007, 23h25

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