Couleur Pixel écran [Résolu]

cedricbi 185 Messages postés mercredi 18 décembre 2002Date d'inscription 21 mars 2011 Dernière intervention - 7 oct. 2007 à 17:09 - Dernière réponse : cedricbi 185 Messages postés mercredi 18 décembre 2002Date d'inscription 21 mars 2011 Dernière intervention
- 8 oct. 2007 à 18:54
Bonjour,
Je cherche une fonction permettant de récuperer la couleur d'un pixel de l'écran.
Il y a la fonction GetPixel mais, elle est trop lente pour ce que je veux en faire...
En fait, je voudrais une fonction un peu comme ScanLine pour un bitmap.
Cela existe-t-il ? Si non, comment faire pour accéder très rapidement à la valeur d'un pixel n'importe où sur l'écran?

Merci

<hr />Le plus dur dans un programme c'est de savoir pourquoi il marche !

/FONT>
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 8 oct. 2007 à 16:29
3
Merci
j'avais fait un truc similaire dans un prog, du bricolage mais bon ... c'est rapide :

uses ClipBrd;

function ColorRefToColor(const C : integer): integer;
begin
  result := (C and $0000FF00) or
            ((C and $000000FF) shl 16) or
            ((C and $00FF0000) shr 16);
end;

function PushAsyncKey(const K : byte) : boolean;
begin
  keybd_event(K, 0, KEYEVENTF_EXTENDEDKEY, 0);
  keybd_event(K, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
  result := true;
end;

type
  pScanLine = ^TScanLine;
  TScanLine = array[0..4096] of integer;

var Bmp : TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Bmp := TBitmap.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Bmp.free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var MP : TPoint;
    N  : integer;
    pScan : pScanLine;
begin
  GetCursorPos(MP);

  ClipBoard.Open;
  try
    PushAsyncKey(windows.VK_SNAPSHOT);
    with TBitmap.Create do
    try
      if ClipBoard.HasFormat(CF_BITMAP) then
      begin
        LoadFromClipboardFormat(CF_BITMAP, ClipBoard.GetAsHandle(CF_BITMAP), 0);

        if MP.X < 0 then
           MP.X := 0
        else
        if MP.X >= Width then
           MP.X := Width-1;

        if MP.Y < 0 then
           MP.Y := 0
        else
        if MP.Y >= Height then
           MP.Y := Height-1;

        pScan := ScanLine[MP.Y];
        Self.Color := ColorRefToColor(pScan[MP.X]);
      end;
    finally
      Free;
    end;
  finally
    ClipBoard.Clear;
    ClipBoard.Close;
  end;
end;

<hr size="2" width="100%" />
http://deefaze.gnomz.com

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de f0xi
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 7 oct. 2007 à 20:52
0
Merci
Salut,

Bigre...

GetPixel faisant appel à l'api Windows (gdi32.dll), je vois pas comment faire plus rapide.

Mais c'est peut-être la routine dans laquelle tu l'utilises qui ralentit ?
Commenter la réponse de japee
cedricbi 185 Messages postés mercredi 18 décembre 2002Date d'inscription 21 mars 2011 Dernière intervention - 7 oct. 2007 à 21:37
0
Merci
Salut,

Non, ma routine ne ralentissait pas, mais je doit quand même analyser tout l'écran (plus d'un millions de pixel soit plus de 4 Mo de mémoire plusieurs fois par seconde... ). Mais j'ai trouvé un moyen (auquel j'aurais pu penser avant)...
Il suffit d'utiliser un BitBlt pour copier le Handle écran vers le Canvas d'un TBitmap puis je fais un Scanline à ma sauce ce que me fait au final 7 lignes en assembleur pour analyser tout l'écran.

Mais maintenant c'est la fonction BitBlt qui me ralentit encore un peu trop! N'existe-t-il pas une autre fonction un peu plus rapide (je suppose que StretchBlt est plus lente) ?

Merci

<hr />Le plus dur dans un programme c'est de savoir pourquoi il marche !

/FONT>
Commenter la réponse de cedricbi
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 8 oct. 2007 à 12:49
0
Merci
Salut,


BitBlt est réputée la plus rapide (Même si elle reste bien lente...).
Faudrait savoir ce qu'utilise les logiciels de capture qui crashent des
vidos en sortie.


Tu peux éventuellement jeter un coup d'oeil sur l'obsolète DirectDraw, nottamment cette classe. 
Commenter la réponse de cs_rt15
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 8 oct. 2007 à 13:00
0
Merci
Ce lien à l'air pas mal sur le sujet des différentes méthodes de captures :

http://www.codeproject.com/dialog/screencap.asp
Commenter la réponse de cs_rt15
cedricbi 185 Messages postés mercredi 18 décembre 2002Date d'inscription 21 mars 2011 Dernière intervention - 8 oct. 2007 à 18:54
0
Merci
lol
effectivement... du gros bricolage...
mais je pense que c'est l'une des meilleurs solutions et des plus rapides! Comme quoi chez Microsoft on se pose pas trop de questions pour ameillorer la vie du programmeur.

<hr />Le plus dur dans un programme c'est de savoir pourquoi il marche !

/FONT>
Commenter la réponse de cedricbi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.