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

Langage Delphi Discussion :

Problème avec GetPixel


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut Problème avec GetPixel
    bonjour à tous
    j'ai créé une application qui permet d'inverser les couleur de l'écran.
    cela fonctionne très bien (avec windows98; sans fond d'écran)
    malheureusement, sous windows XP, l'écran apparais noir.
    où est le problème ??
    Voici mon code :
    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
     
    procedure TForm1.Button8Click(Sender: TObject);
    var
      x, y : dword;
      clr, col : tcolor;
      scrx, scry : integer;
       dc:hdc;
     
     begin
     dc := getwindowdc(getdesktopwindow);
     scrx := GetSystemMetrics(SM_CXSCREEN);
     scry := GetSystemMetrics(SM_CYSCREEN);
     
    for x:=0 to scrx do
        begin
        for y:=0 to scry  do
        begin
     
     col:= getpixel (dc,x,y);
     
           if radiobutton18.checked then
           clr := 255-col;
     
    application.Minimize;
        setpixel (dc, x,y,clr);
    merci pour toutes pistes !

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    SAlut
    Pour inverser les couleur d'une image tu devrais jeter un coup d'oeil sur Bitbnt c'est une fonction graphique qui permet de faire pas mal de chose Google doit etre bavard a son sujet.
    A++
    Qwaz

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut
    Mon problème est simplement de comprendre pourquoi mon appli ne marche pas sous XP
    Mais merci du tuyau
    a+

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    clr := 255-col fonctionne sur des systèmes avec 256 couleurs
    Pour que ca marche aussi sous XP (couleurs 24 ou 32 bits), il faudrait écrire
    clr:=not col ;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut
    Merci !!!
    je vais tester ceci dès que j'aurais accès à un ordinateur sous XP ...

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    voir cette example

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut
    Désoler du temps de réponse, .... mais ça ne marche pas...
    C'est comme si getpixel ne donnais que du noir sauf quelques endroit.
    avez vous une piste ?
    merci

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    dans ton code, je vois ceci :
    clr, col : tcolor;
    ....
    col:= getpixel (dc,x,y);
    ....
    setpixel (dc, x,y,clr);
    et là, je te dis que getpixel et setpixel n'ont absolument rien avoir avec TColor !!!

    Dans le type TColor, les octets sont codés dans cet ordre : Bleu, Vert,Rouge
    Pour t'en convaincre, regarde comment les couleur "primaires" sont codées dans graphics.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    clRed = TColor($0000FF); //<--Rouge à la fin
      clLime = TColor($00FF00);  //<--vert au milieu
      clBlue = TColor($FF0000);//<--Bleu à gauche
    alors que les couleurs renvoyées par getpixel et utilisées par setpixel sont de bètes entiers de type cardinal codées dans cet ordre : Rouge, puis Vert, puis Bleu.

    Donc en gros, celà devient plus logique de déclarer tes variable comme ceci :
    Vérifies donc si ton problême ne vient pas (entre autre) de là.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut
    Merci, je vais essayer ça ...
    mais pourtant avec win 98 , ça marche ...

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par pieroznight Voir le message
    Merci, je vais essayer ça ...
    mais pourtant avec win 98 , ça marche ...
    Peut être le code exposé dans ce fil de discussion t'intéresera-t'il :
    http://www.developpez.net/forums/sho...hlight=gris%E9

    Là il s'agit de prendre un screenshot du bureau, de l'enregistrer dans un bitmap, de le passer la couleur en dégradés de gris (donc on change la couleur, c'est ce que tu essaies de faire), puis affichage du tout sur le bureau en lieu et place de l'existant.

    Bref, de quoi t'inspirer...

  11. #11
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    et en faisant comme ça, ça marche pas:
    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
     
    var
    x,y : dword;
    col : tcolor;
    scrx, scry : integer;
    r,v,b:byte;
    dc:hdc;
     
     begin
     dc := getwindowdc(getdesktopwindow);
     scrx := GetSystemMetrics(SM_CXSCREEN);
     scry := GetSystemMetrics(SM_CYSCREEN);
     
    for x:=0 to scrx do
        for y:=0 to scry  do
        begin
    col:= getpixel (dc,x,y);
    r:=getrvalue(col);
    v:=getGvalue(col);
    b:=getBvalue(col);
    col:=rgb(255-r,255-v,255-b);
    //équivalent je pense col:=not col...
    setpixel (dc,x,y,col);
    end;
    end;
    à voir...
    effectivement, il faudrait sans doute afficher dans un bitmap...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut
    Merci beaucoup pour toute vos réponse, ça me fait plaisir .
    j'essayerai tout ça dès que j'aurais trouve un poste sous xp ...
    Mais quelle est la différence entre xp et 98 pour que sa m**** a ce point là ?

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    C'est plutôt lent GetPixel() et SetPixel()...
    Une alternative...
    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
     
    Var
      ScreenCanvas: TCanvas;
      Screen_bmp: TBitmap;
    Begin
      ScreenCanvas := TCanvas.create;
      Screen_bmp := TBitmap.Create;
      try
        //=== récupération du canvas de l'écran ===
        ScreenCanvas.Handle := getDC(0);
        Screen_bmp.Width := screen.Width;
        Screen_bmp.Height := screen.Height;
        //=== Récupération de l'image ===
        Screen_bmp.Canvas.CopyRect(Rect(0, 0, screen.Width, screen.Height), ScreenCanvas, Rect(0, 0, screen.Width, screen.Height));
        //=== Spécifie que l'on veut inverser ===
        ScreenCanvas.CopyMode :=cmDstInvert	;
        //=== Dessine le bitmap inversé sur le canvas de l'écran ==
        ScreenCanvas.Draw(0, 0, Screen_bmp);
      finally
        Screen_bmp.Free;
        ScreenCanvas.Free;
      end;
    de cette façon, c'est plutôt instantané...

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      dc:=getDC(0);
      If (GetDeviceCaps(dc,RASTERCAPS)and RC_BITBLT)=RC_BITBLT then
        PatBlt(dc, 0, 0, screen.Width, screen.Height, cmDstInvert);
      ReleaseDC(0,dc);

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut

    respect .... rien a dire
    j'avou que de mon coté c'est plutot ridicule
    et bin mille merci ... reste a voir si sa marche sous xp
    merci beaucoup
    a+

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut
    tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ScreenCanvas.CopyMode :=cmDstInver;
    F1 ne donne rien sur cmDstInver. Qu'est ce qu'il ya comme autre valeur ? ou peut on les trouvées ?
    merci a+

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    dans l'unité Graphics sous delphi 5 il y a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmDstInvert = DSTINVERT;
    et dans l'unité windows, tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     {$EXTERNALSYM DSTINVERT}
      DSTINVERT   = $00550009;     { dest = (NOT dest)
    Tu peux faire F1 sur CopyMode pour information.

  18. #18
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par pieroznight
    et bin mille merci ... reste a voir si sa marche sous xp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        dc := GetDC(0);
        If (GetDeviceCaps(dc, RASTERCAPS) And RC_BITBLT) = RC_BITBLT Then
          PatBlt(dc, 0, 0, screen.Width, screen.Height, cmDstInvert);
        ReleaseDC(0, dc);
    Je t'assure que oui.
    sinon, c'est la carte video qui ne supporte pas...

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 71
    Points : 51
    Points
    51
    Par défaut
    champion !
    mon probleme est résolu.... meme si je ne vois pas pourquoi ma methode ne marchait pas sous xp
    a la prochaine

    pieroznight

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

Discussions similaires

  1. Problème avec GetPixel
    Par fabnet dans le forum Windows
    Réponses: 6
    Dernier message: 08/05/2007, 07h27
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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