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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 803
    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 803
    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 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

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/10/2014, 17h58
  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, 15h49
  3. fonctionne sous eclipse mais pas dans un jar
    Par lionel.barrere dans le forum JPA
    Réponses: 3
    Dernier message: 28/01/2010, 15h48
  4. Réponses: 0
    Dernier message: 04/01/2008, 11h40

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