[WinApi] Pobranie pixela...

0

Witam :)
Pisze program, ktory m.in. musi jak najczesciej sprawdzac kolor okreslonych pixeli na ekranie.
Program pisze w BCB i do tej pory robie to tak:

HDC hDC = GetDC(NULL);
if(GetPixel(hdc, 100, 100)==kolor)
{
//...
}
ReleaseDC(NULL, &hDC);

Wypisany kod wywoluje w TTimer::OnTimer co 1 ms (teoretycznie).
Kod poczatkowo dziala poprawnie, jednak po okolo 100 000 wywolan tych instrukcji funkcja GetPixel() zwraca 0 mimo, ze hDC!=NULL i pixel nie jest czarny.

Chodzi tu zapewne o przesadzanie z dostepem do kontekstu ekranu, ale dlaczego? :P
Zna ktos inny sposob, ktory byl by bezpieczny? Musze koniecznie dobrac sie do koloru tych pixeli i to najlepiej jak najdziesciej i przez dlugi okres czasu :]

Czekam na wszelkie podpowiedzi i pozdrawiam

0

Skopiuj sobie całą bitmapę do zwyczajnej pamięci, a pixelowanie będzie znacznie szybsze niż poprzez GDI i nie zawiedzie pÓÓÓÓki nie przekroczysz granicy pamięci :]

	BITMAPINFO bi
// inne zmienne
	ClearStack()
	hDC = GetDc(hwnd)
	cDC = CreateCompatibleDc(hDC)
	cBM = CreateCompatibleBitmap(hDC, W, H)
	oBM = SelectObject(cDC, cBM)

	memsize = ((W*H)<<2)
	memo = AllocHeap(memsize)

	bi.bmiHeader.biSize   = sizeof(BITMAPINFOHEADER)
	bi.bmiHeader.biWidth  = W
	bi.bmiHeader.biHeight = H
	bi.bmiHeader.biPlanes = 1
	bi.bmiHeader.biBitCount = 32

	BitBlt(cDC, 0,0, W,H, hDC, L,T, SRCCOPY)
	GetDIBits(cDC, cBM, 0, H, memo, &bi, DIB_RGB_COLORS)

	SelectObject(cDC, oBM)
	DeleteObject(cBM)
	DeleteDc(cDC)
	ReleaseDc(hwnd, hDC)

teraz zmienna memo wskazuje na lewy dolny pixel obrazu

pointer do dowolnego pixela (X,Y):

	ptr = memo+( (Y<<2)*W ) + (X<<2)

proces odwrotny (rysowanie pamięci na HDC)

//BITMAPINFO takie samo jak wyżej
SetDIBitsToDevice(hDC, L,T, W,H, 0,0, 0,H, memo, &bi, DIB_RGB_COLORS)
0

Dzieki za dobre checi, ale Twoje rozwiazanie nie zmienia nic w tym przypadku.

Musze koniecznie dobrac sie do koloru tych pixeli i to najlepiej jak najdziesciej i przez dlugi okres czasu

Tak czy siak musze wywolywac ta funkcje jak najdziesciej, wiec zawartosc ekranu skopiowana w inne miejsce pamieci mysle w tym wypadku nie pomoze :/.
Jak na razie po prostu staram sie zadziej pobierac kontekst bitmapy ekranowej, ale to nie jest elegancje wyjscie :|.

Mimo wszystko dzieki za dobre checi [browar]

Pozdrawiam

0

BTW.: Gdyby zawartosc ekranu byla stala to nie bylo by problemu ;)

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