Skanowanie obrazu wyświetlanego na monitorze.

dział ogólny

Skanowanie obrazu wyświetlanego na monitorze.

Nowy postprzez Koziol » czwartek, 11 marca 2010, 17:55

Witam, chciał bym się dowiedzieć czy istnieje możliwość pobrania koloru wyświetlanego przez monitor dla konkretnego piksela (grupy) jedyne co udało mi sie znalezc to na bazie screenshota :(
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

Re: Skanowanie obrazu wyświetlanego na monitorze.

Nowy postprzez Cyfrowy Baron » czwartek, 11 marca 2010, 18:13

Najpierw robisz zrzut ekranu, a potem pobierasz kolor interesujÄ…cego ciÄ™ piksela.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Skanowanie obrazu wyświetlanego na monitorze.

Nowy postprzez Koziol » czwartek, 11 marca 2010, 18:48

A jest możliwość zrobienia screenshota wybranego fragmentu ekranu?
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

Re: Skanowanie obrazu wyświetlanego na monitorze.

Nowy postprzez Michalos » czwartek, 11 marca 2010, 20:07

Koziol napisał(a):A jest możliwość zrobienia screenshota wybranego fragmentu ekranu?


Robisz najpierw zrzut ekranu całego pulpitu bądź zrzut tylko okna programu i z tego zrzutu wycinasz fragment z użyciem funkcji CopyRect.

Pozdrawiam
Avatar użytkownika
Michalos
Bladawiec
Bladawiec
 
Posty: 35
Dołączył(a): niedziela, 19 października 2008, 11:45
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    Windows XPFirefox

Re: Skanowanie obrazu wyświetlanego na monitorze.

Nowy postprzez Koziol » czwartek, 11 marca 2010, 20:11

Michalos napisał(a): bądź zrzut tylko okna programu


Jak coś takiego zrobić ? Nie wiem czy to istotne ale ów program jest grą.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

Re: Skanowanie obrazu wyświetlanego na monitorze.

Nowy postprzez Cyfrowy Baron » piÄ…tek, 12 marca 2010, 07:05

Przykładowy kod robi zrzut ekranu do Image1 wybranego okna programu - tutaj Notatnik - potem wycina z niego fragment o wymiarach 50x50 w pozycji 200, 200 pikseli w odniesieniu do górnego lewego rogu tegoż okna i wyświetla wynik w Image2:

Kod: Zaznacz cały
TCanvas *pCanvas = new TCanvas();
Graphics::TBitmap *Bmp = new Graphics::TBitmap;

HWND okno = FindWindow("Notepad", NULL);

SetActiveWindow(okno); /* przywołanie okna na pierwszy plan lub przywrócenie okna jeżeli zminimalizowane */

TRect r;
GetWindowRect(okno, &r);

/* SetWindowPo zmienia pozycję okna programu na pulpicie, na wypadek, gdyby okno wychodziło poza ekran, jeżeli zbędna można funkcję usunąć */
SetWindowPos(okno, HWND_TOP, 0, 0, NULL, NULL, SWP_NOSIZE);
Sleep(100);

SetActiveWindow(okno); /* ponowne przywołanie okna na pierwszy plan - potrzebna jeżeli okno było wcześniej zminimalizowane i przywrócone */

  pCanvas->Handle = GetWindowDC(okno);
TRect oR;
GetWindowRect(okno, &oR);
Bmp->Width = oR.Width();
Bmp->Height = oR.Height();
Bmp->Canvas->CopyRect(Rect(0, 0, Bmp->Width, Bmp->Height), pCanvas, Rect(0, 0, Bmp->Width, Bmp->Height));

Image1->Width = oR.Width();
Image1->Height = oR.Height();
Image1->Picture->Assign(Bmp);

Image1->Canvas->Brush->Style = bsClear;
Image1->Canvas->Pen->Color = clBlue;
Image1->Canvas->Rectangle(200, 200, 250, 250);

Graphics::TBitmap *fragBmp = new Graphics::TBitmap;
fragBmp->Width = 50;
fragBmp->Height = 50;
fragBmp->Canvas->CopyRect(Rect(0, 0, 50, 50), Bmp->Canvas, Rect(200, 200, 250, 250));

Image2->Width = 50;
Image2->Height = 50;
Image2->Picture->Assign(fragBmp);

ReleaseDC(0, pCanvas->Handle);

delete pCanvas;
delete Bmp;
delete fragBmp;


Przechwytywane okno nie może być zminimalizowane ani niczym przesłonięte, dlatego kod zawiera funkcje przywracające i przywołujące okno na pierwszy plan.



Jak coś takiego zrobić ? Nie wiem czy to istotne ale ów program jest grą.


Istotne, gdyż powyższy kod zadziała tylko wtedy, gdy gra jest uruchomiona w trybie okienkowym. Jeżeli gra jest na pełnym ekranie do do przechwycenia ekranu gry trzeba by wykorzystać funkcje DirectX lub OnpenGL, a o tym to już nic nie wiem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 33 gości