cedricbi
Messages postés185Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention21 mars 2011
-
7 oct. 2007 à 17:09
cedricbi
Messages postés185Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention21 mars 2011
-
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 !
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 8 oct. 2007 à 16:29
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;
cedricbi
Messages postés185Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention21 mars 2011 7 oct. 2007 à 21:37
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 !
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 8 oct. 2007 à 12:49
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.
cedricbi
Messages postés185Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention21 mars 2011 8 oct. 2007 à 18:54
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 !