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

Delphi Discussion :

Lire la couleur d'un pixel : fonctionne dans XP mais pas dans windows 7 ! Pourquoi ?


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut Lire la couleur d'un pixel : fonctionne dans XP mais pas dans windows 7 ! Pourquoi ?
    Bonjour,

    J'ai bricolé un petit programme qui scan une zone de l'écran (et pas seulement de l'application) autour de mon curseur à la recherche de pixels d'une couleur désiré. Pour chaque pixel trouvé je sort sa valeur RGB et sa position X,Y dans un Memo.

    Ce programme, fonctionne très bien sous XP, mais sous windows 7 ça plante ! Hors c'est là qu'il est sensé servir...

    Mon programme:
    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
     
    function ColorPixel(P: TPoint): TColor;
    var
      DC: HDC;
    begin
      DC:= GetDC(0);
      Result:= GetPixel(DC,P.X,P.Y);
      ReleaseDC(0,DC);
    end;
     
    procedure TForm1.TimerSCTimer(Sender: TObject);
    var
      P: TPoint;
      PixelLu : Tpoint;
      R,G,B: integer;
      ZoneH, ZoneL, ZAX, ZAY, ZDX, ZDY : integer;
      i, j : integer;
    begin
      GetCursorPos(P);
     
      // CALCUL DE LA ZONE DANS LAQUELLE ON DOIT CHERCHER
      ZoneH := strtoint(EditZoneH.Text);
      ZoneL := strtoint(EditZoneL.Text);
     
      ZAX := P.X - (ZoneL div 2);
      ZAY := P.Y - (ZoneH div 2);
     
      ZDX := P.X + (ZoneL div 2);
      ZDY := P.Y + (ZoneH div 2);
     
     
      // SCANNER LA ZONE
      for j:=ZAY to ZDY do //verticalement
        begin
          for i:=ZAX to ZDX do //horizontalement
            begin
              PixelLu := Point(i,j);
              Color:= ColorPixel(PixelLu);
              R := Color and $ff;
              G := (Color and $ff00) shr 8;
              B := (Color and $ff0000) shr 16;
     
              // TRAITEMENT DETECTION ORANGE
              if ((R >= 233) and (R <= 255)) and ((G >= 120) and (G <= 140)) and ((B >= 60) and (B <= 90)) then
                begin
                  LbOutput.Caption := 'Orange trouvé !!!' ;
                  MemoOutput.Lines.Add('Orange trouvé !'+ ' [R= '+inttostr(R) + ' G= '+inttostr(G) +' B= '+inttostr(B)+'] at [x:'+inttostr(i)+ ' y:'+inttostr(j)+']');
                end
                  else LbOutput.Caption := '...';
            end;
       end;
    end;
    Si je commente la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Color:= ColorPixel(PixelLu);
    alors le programme ne plante plus (mais n'as plus d'intérêt) ce qui me pousse à penser que ma fonction de lecture de couleur pose problème sous windows 7.

    Pourquoi ça ne marche pas avec 7 ?
    Comment contourner ce problème ?

    Merci !

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 785
    Par défaut
    Pour te donner une piste, il y a eu des changements très importants avec Vista et notamment pour l'affichage.

    En gros avec XP, il y avait comme problème que Windows rafraîchissait tout l'écran et était incapable de rafraîchir une petite zone. On se souvient des traces laissées lorsqu'on déplaçait un logiciel qui tournait à 100%.
    Avec Vista, Microsoft est passé à l'accélération 3D (qui se souvient de Flip 3D ), aux effets notamment de transparence avec Aéro et à la vectorisation (du moins "un début de"). Peut-être qu'il y en a d'autres (comme la mise au placard de cette salop*rie de GDI+ au profit de Direct2D, mais c'est plus une conséquence qu'une cause)

    Et donc on peut penser qu'on est passé d'un framebuffer à l'ancienne à du double buffering et donc tu lis le mauvais tampon
    Il y a eu le même problème avec Windows Media Player 9 ou 10 : lorsqu'on prenait des captures d'écran, la vidéo n'apparaissait pas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut
    Merci pour la piste, je vais chercher de ce côté.

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    ça plante !
    mais encore ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    mais encore ?
    Le programme plante. Le titre de la fiche passe de "Form1" à "Form1 (Ne répond pas)" tandis que le curseur passe de la flèche au "rond bleu qui tourne". Quand je clic sur la croix pour fermer le programme j'ai la fiche à choix multiple (rechercher une solution et fermer / fermer / attendre) qui donne ces détails :

    Description :
    Un problème a provoqué l’arrêt de l’interaction de ce programme avec Windows.

    Signature du problème*:
    Nom d’événement de problème: AppHangB1
    Nom de l’application: Project1.exe
    Version de l’application: 0.0.0.0
    Horodatage de l’application: 2a425e19
    Signature de blocage: e71a
    Type de blocage: 0
    Version du système: 6.1.7601.2.1.0.768.3
    Identificateur de paramètres régionaux: 1036
    Signature de blocage supplém. 1: e71a99e655cadc20f965f7c89bc0b015
    Signature de blocage supplém. 2: cc1d
    Signature de blocage supplém. 3: cc1d9726622cfa98e8bcdd83a8349e83
    Signature de blocage supplém. 4: e71a
    Signature de blocage supplém. 5: e71a99e655cadc20f965f7c89bc0b015
    Signature de blocage supplém. 6: cc1d
    Signature de blocage supplém. 7: cc1d9726622cfa98e8bcdd83a8349e83

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    je viens de tester, ton code fonctionne chez moi

    tu utilises quelles valeurs pour EditZoneH/L et SCTimer.Interval ?

    et c'est délibéré d'utiliser la propriété Color de la fiche ? elle change à chaque itération sans grand intérêt je pense
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut
    Intéressant.

    Le timer est réglé sur 1ms d'interval. EditZoneH/L sur 100.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    et c'est délibéré d'utiliser la propriété Color de la fiche ? elle change à chaque itération sans grand intérêt je pense
    C'est vrai que c'est totalement dispensable (c'était pour tester au départ). Cela dit ça change rien au schmilblick.

  9. #9
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut ton petit problème m'a intrigué du coup je me suis amusé à faire un petit truc ressemblant à une petite application similaire que j'avais réalisé sous Lazarus. J'ai un peu amélioré la bête en passant

    tout est dans le zip ColorPicker.zip (MAJ à 21h51)

    A+
    Fichiers attachés Fichiers attachés
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fred7 Voir le message
    C'est vrai que c'est totalement dispensable (c'était pour tester au départ). Cela dit ça change rien au schmilblick.
    Pas vraiment car tu associes le Color de la fiche dans ta boucle ça n''a pa sa place ici. Tu devrais le placer AVANT ta boucle et là oui cela serai plus logique
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  11. #11
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par fred7 Voir le message
    Intéressant.

    Le timer est réglé sur 1ms d'interval. EditZoneH/L sur 100.
    ah oui, donc toutes les millisecondes tu regardes 10000 pixels à l'écran...tu t'étonnes que ça rame ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 125
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut ton petit problème m'a intrigué du coup je me suis amusé à faire un petit truc ressemblant à une petite application similaire que j'avais réalisé sous Lazarus. J'ai un peu amélioré la bête en passant

    tout est dans le zip ColorPicker.zip (MAJ à 21h51)

    A+
    Wah l'autre comment il frime
    Blague à part, grand merci à toi, j'ai appris beaucoup en lisant ton code et ta façon d'aborder le problème.

    Citation Envoyé par Paul TOTH
    ah oui, donc toutes les millisecondes tu regardes 10000 pixels à l'écran...tu t'étonnes que ça rame ?
    Mon programme n'a jamais "ramé". Il tournait très bien sous xp (là où il fut écrit) et plantait sous 7. Donc oui je cherchais à comprendre pourquoi.

  13. #13
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 940
    Billets dans le blog
    6
    Par défaut
    Il ne plante pas plus sous W7 ; mais, il mobilise toutes les ressources disponibles pour ce traitement plus long que l'intervalle entre chacune de ses itérations et n'a plus la possibilité de répondre aux messages... Ceci n'expliquant pourquoi tu n'observais pas ceci sous une ancienne configuration. Quant à cet intervalle, l'écran peut-il être rafraîchi aussi vite ? A 1 milliseconde, il y aurait 1000 fps ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  14. #14
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 785
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Ceci n'expliquant pourquoi tu n'observais pas ceci sous une ancienne configuration. Quant à cet intervalle, l'écran peut-il être rafraîchi aussi vite ? A 1 milliseconde, il y aurait 1000 fps ?
    Cela peut s'expliquer simplement

    Sous XP, tu as un accès direct à la mémoire graphique : donc tu lis la couleur directement dans le framebuffer. Et apparemment, il n'y a pas de verrous.
    Et depuis Vista, pour 1 lecture, il peut y avoir des opérations comme des bit blit et surtout il y a des verrous.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/10/2014, 16h58
  2. Requête fonctionnant sur ssms mais pas dans mon programme
    Par tumoo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2011, 14h49
  3. fonctionne sous eclipse mais pas dans un jar
    Par lionel.barrere dans le forum JPA
    Réponses: 3
    Dernier message: 28/01/2010, 14h48
  4. Réponses: 0
    Dernier message: 04/01/2008, 10h40

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