2010-11-21 19 views
7

Używam GetPixel() z gdi32.dll w aplikacji .NET, aby pobrać próbkę koloru piksela w dowolnym miejscu na ekranie. Działa dobrze, ale jest dla mnie poważnym wąskim gardłem.Czy istnieje szybsza alternatywa dla GDI GetPixel()?

Czy jest to szybszy sposób?

+2

Jakiego rodzaju użycie jest potrzebne? Może warto chwycić region na ekranie, a następnie próbkować z niego piksele. – hometoast

+0

Moja aplikacja pozwala użytkownikowi na próbkowanie kolorów z dowolnego miejsca na ekranie (poza moją aplikacją) w czasie rzeczywistym. +1 Dobry pomysł na ograniczenie do regionu: Zobaczę, czy mogę to zrobić. – stucampbell

Odpowiedz

8

Szybki dostęp do pikseli jest możliwy za pomocą metody LockBits() z Bitmap. Spowoduje to powrót do obiektu zawierającego wskaźnik do początku danych pikseli, a do uzyskania dostępu do pamięci można użyć niebezpiecznego kodu.

http://www.bobpowell.net/lockingbits.htm

+0

Dzięki. Przegrałem, ponieważ jest to przydatny artykuł do innych manipulacji obrazami, które robię. Ale nie pomaga mi to uzyskać koloru piksela w dowolnym miejscu na ekranie (chyba że najpierw zrobię zrzut ekranu, co nie jest tym, czego chcę). – stucampbell

5

GetPixel jest powolny z dwóch powodów:

  1. Skoro jesteś sondowania ekran - każde wezwanie do GetPixel prowadzi do transakcji do sterownika wideo, który z kolei bierze piksel dane z pamięci wideo.

    W constrast użyciu GetPixel na DIBs jest znacznie szybszy.

  2. Zresztą GetPixel robi kilka rzeczy, w tym współrzędne obcinania/przekształceń itp

tak, że jeśli używasz do kwerendy wiele wartości pikseli na raz - należy spróbować zorganizować to w jednym transakcję do sterownika GDI/wideo.

Za pomocą GDI powinieneś utworzyć DIB o odpowiednim rozmiarze (patrz CreateDIBSection). Po utworzeniu otrzymasz bezpośredni wskaźnik do danych bitów obrazu. Następnie skopiuj część obrazu do DIB (patrz BitBlt). Nie zapomnij również zadzwonić pod numer GdiFlush, zanim faktycznie sprawdzisz zawartość DIB (ponieważ sterowniki wideo mogą wykonywać rysowanie asynchroniczne).

Używając GD + możesz faktycznie zrobić to samo, z nieco prostszą składnią.

+0

Dzięki. Wypróbuję to. – stucampbell

Powiązane problemy