récupérer la couleur d'un pixel sur l'écran ?

récupérer la couleur d'un pixel sur l'écran ? - Ada - Programmation

Marsh Posté le 13-08-2004 à 23:00:37    

Salut à tous !
 
Je cherche un moyen de récupérer la couleur d'un pixel sur l'écran.
Comment faire ?

Reply

Marsh Posté le 13-08-2004 à 23:00:37   

Reply

Marsh Posté le 14-08-2004 à 10:59:51    

Bonjour
Adagraph est une librairie graphique pour Windows (j'ignore si elle existe sous Linux) qui permet, entre autres, de récupérer un pixel dans une fenetre créée par le programme.
Mais je ne crois pas que ce soit ce que tu cherche...

Reply

Marsh Posté le 14-08-2004 à 12:25:00    

Merci pour ta réponse.
 
En fait, je viens de regarder dans Adagraph, mais là, mes connaissances sont un peu limitées dans le domaine.
J'ai essayé ceci :  
 
with ada.text_io; use ada.text_io;      
with adagraph; use adagraph;
 
procedure z2
is  
   couleur:integer;
   function GetColorPixel (X, Y: Integer) return Integer;
   pragma Import (C, GetColorPixel, "GetColorPixel" );
     
begin
   for x in 0..200
   loop
      for y in 0..200
      loop
         couleur:=getcolorpixel (x,y);
         put_line (integer'image(couleur));
      end loop;
   end loop;
end z2;
 
-> problème : affiche "-5" pour chaque point ...
J'ai vu par ailleurs, si j'ai bien compris, que l'écran en lui-même était une fenêtre et qu'on peut récupérer son contexte. Mais là, je ne vois pas comment faire avec ces éléments.
Une idée ?

Reply

Marsh Posté le 15-08-2004 à 14:03:46    

Adagraph n'est sans doute pas capable de gérer un fenetre qu'il n'a pas créé lui-même. Avec

Code :
  1. for X in 0..200 loop
  2.       for Y in 0..200 loop
  3.          Adagraph.Put_Line ( Adagraph.Color_Type'Image ( Adagraph.Get_Pixel ( X, Y ) ) );
  4.       end loop;
  5.    end loop;


l'exception ADAGRAPH.CREATE_THREAD_FAILED est levée. Donc il ne gère pas l'écran...

Reply

Marsh Posté le 15-08-2004 à 14:04:29    

PS : essaye une autre librairie qu'Adagraph.

Reply

Marsh Posté le 16-08-2004 à 13:39:39    

Peut-être avec des bibliotheques comme "claw", "glut", ou "jewl" ?

Reply

Marsh Posté le 28-08-2004 à 15:46:58    

J'ai trouvé ceci sur le web:
 
Pour capturer l'écran Windows, il suffit d'obtenir un DC (Device Context) sur le bureau, en utilisant la procédure suivante :
 
function GetWinBmp: TBitmap;
var
  DC: HDC;
  Canvas: TCanvas;
  R: TRect;
begin
  // Création du Bitmap
  Result := TBitmap.Create;
  Result.Width := Screen.Width;
  Result.Height := Screen.Height;
  // Récupération du DC
  DC := GetDC(0);
  // Affectation du Canvas
  Canvas := TCanvas.Create;
  Canvas.Handle := DC;
  // Récupération de l'image
  R := Rect(0, 0, Screen.Width, Screen.Height);
  Result.Canvas.CopyRect(R, Canvas, R);
  // Libération du Canvas
  Canvas.Free;
  // Libération du DC
  ReleaseDC(0, DC);
end;
 
 
En Ada, ça donnerait quoi ?

Reply

Marsh Posté le 29-08-2004 à 15:08:57    

C'est en quel langage ?

Reply

Marsh Posté le 29-08-2004 à 17:57:57    

TBitmap : c'est la VCL (Delphi). Pas utilisable en ADA.
Je pige mieux du coup sa question sur l'assembleur.
sponge bob : tu peux normalement le faire depuis ADA directement, si tu peux utiliser win32. Quand j'utilisais Aonix Object ADA c'était possible. A peu de choses près le code donné dans ton autre topic devrait marcher.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 29-08-2004 à 22:09:27    

Salut à tous !
 
Milles excuses à ceux auxquels j'ai oublié de répondre auparavant.
J'ai trouvé ce que je cherchais.
Petit exemple :
 
with System;
with ada.text_io; use ada.text_io;
 
procedure z  
is  
   type tableau is array (0..800,0..600) of integer;
   t:tableau;
   pragma Linker_Options ("-luser32 -lgdi32" );
   subtype HDC is System.Address;
   subtype HWND is System.Address;
   my_hdc:HDC;
   my_hwnd:HWND;
   c:integer;
   bool:boolean;
   function GetDC (my_hwnd0 : HWND) return HDC;
   pragma Import (Stdcall, GetDC,"GetDC" );
   function GetPixel (my_hdc0:HDC;x:integer;y:integer) return integer;
   pragma Import (Stdcall, GetPixel,"GetPixel" );
   function setPixelv (my_hdc0:HDC;x:integer;y:integer;c:integer) return boolean;
   pragma Import (Stdcall, SetPixelV,"SetPixelV" );
begin
   my_hdc:=getdc (System.Null_Address);
   for i in 0..800
   loop
      for j in 0..600
      loop
         c:=getpixel (my_hdc,i,j);
         t(i,j):=c;              
      end loop;
   end loop;
   for i in 0..800
   loop
      for j in 0..600
      loop
         bool:=setpixelv (my_hdc,i,j,t(i,j)+200);          
      end loop;
   end loop;
end z;
 
A+

Reply

Marsh Posté le 29-08-2004 à 22:09:27   

Reply

Marsh Posté le 23-12-2004 à 12:08:33    

Cette methode est pour recuperer un pixel HS sur un ecran
merci

Reply

Marsh Posté le 23-12-2004 à 14:11:55    

De rien.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed