GetPixelRGB.

0

Witam,
od pewnego czasu przeglądam internet w poszukiwaniu rozwiązania mojego problemu, ale wciąż nie mogę znaleźć odpowiedzi. Postanowiłem napisać na tym forum.

Potrzebuje funkcję, która pobierze i zwróci kolory RGB danej pozycji (X, Y).

Próbowałem nawet z assembly, ale jak zawsze, skompilowany program się zamyka. Znalazłem coś takiego, ale niestety nie znam asm.

{$asmmode intel}
function GetPixel(X, Y: integer): byte; assembler;
asm;
	mov AX,0A000H
	mov ES,AX
	mov DX,Y
	mov DI,X
	shl DX,6
	add DI,DX
	shl DX,2
	add DX,DI
	mov AL,ES:[EDI]
	mov @result,AL
end;
0

z własnego okna, nie z pulpitu

GetPixelRGB(X, Y, R, G, B);
pozycje wprowadzam ja a kolory wrzucane są do zmiennych

Edit:
W bibliotece WinGraph (http://math.ubbcluj.ro/~sberinde/wingraph/) jest funkcja:

function GetPixel(x,y:smallint): longword;

Korzysta ona z wielu innych funkcji, przez co ciężko mi ją z tej biblioteki wydostać. Mógłby ktoś wydobyć i wkleić tutaj?

0

z okna, nie z pulpitu

Z własnego okna, czy okna innej aplikacji?

0
procedure TForm1.Timer1Timer(Sender: TObject);
var
  cnvDesktop: TCanvas;
  pntPixel: TPoint;
  clrPixel: TColor;
begin
  cnvDesktop := TCanvas.Create();
  try
    cnvDesktop.Handle := GetWindowDC(GetDesktopWindow());
    GetCursorPos(pntPixel);
    clrPixel := ColorToRGB(GetPixel(cnvDesktop.Handle, pntPixel.X, pntPixel.Y));

    //clrPixel zawiera kolor piksela o współrzędnych kursora myszy
  finally
    cnvDesktop.Free();
  end;
end;

Sprawdziłem czy podpinając kanwę pod pulpit będą uwzględniane także okna i tak - będą; Sprawdziłem na tajmerze i śmiga; Przerób sobie pod własne wymagania;

EDIT: Ciebie @interp124 powinny interesować tylko te instrukcje:

var
  cnvDesktop: TCanvas;
begin
  cnvDesktop := TCanvas.Create();
  try
    cnvDesktop.Handle := GetWindowDC(GetDesktopWindow()); //tu podpinasz się pod pulpit

    //i teraz mając współrzędne pobierasz kolor funkcją GetPixel, gdzie
    //podajesz jako uchwyt - cnvDesktop.Handle i współrzędne
  finally
    cnvDesktop.Free();
  end;
end;
0

A nie prościej:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd144909%28v=vs.85%29.aspx
var hdc:THandle;
var pixel:DWord;
hdc:=GetWindowDC(GetDesktopWindow()); // to można zrobić raz na początku programu
pixel:=GetPixel(hdc,X,Y);
R:=GetRValue(pixel);
G:=GetGValue(pixel);
B:=GetBValue(pixel);
ReleaseDC(GetDesktopWindow(),hdc); // to można zrobić raz na końcu programu

0

Dziękuje, że tracicie czas, ale ja potrzebuje wychwycić kolory pikseli zawartości okna Graph za pomocą freepascal, a jako że freepascal obiektowy nie jest, nie mogę użyć takiej funkcji (Furious Programming).

0
interp124 napisał(a):

Dziękuje, że tracicie czas, ale ja potrzebuje wychwycić kolory pikseli zawartości okna Graph za pomocą freepascal, a jako że freepascal obiektowy nie jest, nie mogę użyć takiej funkcji (Furious Programming).
Po pierwsze, FreePascal jest obiektowy więc możesz użyć. Po drugie, to co ja podałem to czyste WinAPI = żadnej obiektowości.

0

Skompilowało, za chwile napiszę czy działa.

  1. Strasznie wolno działa.
  2. Wygląda na to, że pobiera kolory z pulpitu a nie okna bo jako tło rysowało kawałek mojej tapety.
0

Jak potrzebujesz więcej niż jeden piksel to wtedy ma sens skopiować najpierw całość do bitmapy a potem scanline'em obrabiać.
Czyli to o czym pisał @furious programming

0

jakaś paranoja. Przecież to wszystko jest w pierwszych dwóch wynikach wyszukiwania w google, które podałem na początku. Ja rozumiem, że można być noobem, który nic nie potrafi, ale żeby prostytutka nawet nie zobaczyć na pierwszego linka z googla, nie przekopiować 10 linii kodu i nie sprawdzić czy działa???

interp124 napisał(a):
  1. Strasznie wolno działa.

niech zgadnę - zrobiłeś dwie pętle od 1 do width i drugą od 1 do height pulpitu i odczytywałeś piksel po pikselu...

  1. Wygląda na to, że pobiera kolory z pulpitu a nie okna bo jako tło rysowało kawałek mojej tapety.
interp124 napisał(a):

potrzebuje wychwycić kolory pikseli zawartości okna Graph za pomocą freepascal

a co to jest to magiczne okno graph? Bo mam wrażenie, że mowa o 'dosowym' trybie graficznym, a tam to niestety tak nie będzie działało

0

Jest sobie plik zawierający 1600 linijek (X, Y, R, G, B, A), przetwarzam go, wrzucam do zmiennych, tworzę pętle w której obliczam alfe każdego piksela, ustawiam palete RGB, wyświetlam piksel w danej pozycji. <- to wszystko wszystko nie mruga nawet w drugiej pętli bez opóźnienia. Gdy dodam to co napisał _13th_Dragon, czas się zwiększa i na narysowanie całości potrzeba 1-2 min.

//abrakadaber, muszę się przyzwyczaić do klas, myślałem że w fp tego nie ma i nawet nie brałem tego kodu z twojego linku pod uwagę

do zamknięcia, jakoś sobie poradzę.. może

0

Chciałeś JEDEN piksel - to dostałeś odpowiedź jak to zrobić. Potem się okazało, że jednak nie jeden a wszystkie? - też dostałeś odpowiedź - zrób printscreena i potraktuj go scanline. Czego jeszcze nie wiesz? Bo mam takie wrażenie, że to co opisałeś ma się nijak do tego co chcesz zrobić.
BTW ten zrzut ekranu to co miał pokazać?

0

Cały czas pisałem, że chce pobrać piksel z zawartości okna (tego, które tworzy moduł Graph) a nie pulpitu. Po to był ten zrzut.

1 użytkowników online, w tym zalogowanych: 0, gości: 1