[WinApi] odczyt koloru piksela

0

Witam! Poszukuje kodu źródłowego lub porad jak pobrać z ekranu kolor piksela. Bez problemów napisałem to za pomocą funkcji GetPixel ale szybkość jej działania nie jest zadowalająca :-/ ...szukając informacji w sieci napotknełem się na funkcje GetDIBits , jednak nie potrafiłem za jej pomocą wyciągnąć kolory z piksela w formacie COLORREF.

0

szukając informacji w sieci napotknełem się na funkcje GetDIBits

Te forum też posiada tę magiczną funkcję... szukaj...

Wpisz GetDIBits

np:
http://4programmers.net/Forum/viewtopic.php?id=129973

Nie mówiąc o MSDN

0

Niestety nie wiem jak z nawet z tego wyciągnąć kolory poszczególnych pikseli;/
czy kolor jest zapisany w bufor czy w strukturze BITMAPA??

0

W BITMAPA z przykladu, umieszczona jest paleta kolorow. Jesli taka wlasnie 'paletowa' bitmape edytujesz, to PIXELE zawieraja NUMERY kolorow z palety, a nie zakodowane RGB.

0

W dniu 24 listopada 2009 21:31 użytkownik ferency1 [CIACH!] napisał:

Pisałeś na forum o bitmapie:
http://4programmers.net/Forum/579769?h=

Wiesz jak zrobić histogram bitmapy dla RGB ???
Ukatrupią mnie na zajęciach jak histogramu nie wymysle ; D
Umiem wczytać bitmapę z pliku, zrobiłem to pod MFC w Visual 2008
Jak byś miał jakies rady pliki proszę o pomoc : )

pozdro
Adam

Histogram zawsze powstaje na podstawie pewnych danych liczbowych i zawsze z pewna zadana "rozdzielczoscia" oraz "zakresem".
Musisz sobie wybrac/wyliczyc/wymyslic, jak gesty ma on byc oraz od jakiej wartosci minimalnej do jakiej wartosci maksymalnej, a takze wymyslic, co dokladnie (jaka charakterystyke) bedzie prezentowac.

Samo przygotowanie histogramu jest debilnie proste:

  • przygotowujesz pojemnik na wyniki, musi on miec dokladnie tyle przegrodek, jaka sobie rozdzielczosc wymysliles
  • zerujesz wyniki
  • dla kazdej danej wejsciowej, obliczasz jej charakterystyke
  • dla kazdej wyliczonej charakterystyki, jezeli jest ona wieksza= niz min.zakresu oraz mniejsza= niz maks. zakresu, obliczasz do ktorej przegrodki ona ma wpasc
  • wynik w przegrodce zwiekszasz o 1

Jesli wymyslisz sobie analize kanalow bitmapy RGB 24bit, to jeden kanal ma w niej 8bitow, czyli wartosci 0-255. To Twoj zakres min-max - na inne nie ma szans, i nawet nie ma co sprawdzac. Skoro kanal ma 256 mozliwych wartosci - jest tego wzglednie malo - mozesz sobie to przyjac za rozdzialczosc.
Dla takiego zalozenia, potrzebujesz wiec pojemnik na 256 przegrodek trzymajacych ilosci trafien. Np. unsigned long int tab[256];
Zerowa przegrodka odpowiada za wartosci R=0.
Pierwsza przegrodka odpowiada za wartosci R=1.
..
255-ta przegrodka odpowiada za wartosci R=255.
Analizujesz kanal R: dla kazdego piksela, wyciagasz jego R, jesli R=13 to ++tab[13]. jesli R=123 to ++tab[123] itp
Po przeleceniu wszystkich pikseli, w 'tab' masz histogram kanalu R - czyli rozklad/statystyke wartosci R jakie trafialy sie w bitmapie.

Jesli wymyslisz sobie analize "jasnosci" bitmapy RGB 24bit, czyli informacji jak bardzo jasne piksele byly i wymyslamy sobie charakterystyke w postaci X=ln(1+R+B+G) dla tychze pikseli. To oznacza ze Twoj osiagalny min-max to 0.000 - 6.64118217. Formalnie, ta log-suma ma dokladnie 766 mozliwych wartosci - powiedzmy ze nie zauwazamy tego lub jest tego wzglednie duzo - przyjmujemy rozdzielczosc 100.
Dla takiego zalozenia, potrzebujesz wiec pojemnik na 100 przegrodek trzymajacych ilosci trafien. Np. unsigned long int tab[100];
Zerowa przegrodka odpowiada za wartosci -0.0001 <= R < 0,0664118217, nie od 0.0000 poniewaz floatingpoint maja bledy zaokraglen
Pierwsza przegrodka odpowiada za wartosci 0,0664118217 <= R < 0,1328236434
..
255-ta przegrodka odpowiada za wartosci 6,5747703483 <= R <6.6411821>8< nie ...7, poniewaz floatingpoint maja bledy zaokraglen
Analizujesz X: dla kazdego piksela, obliczasz jego X, jesli X=0.05 to ++tab[0]. jesli X=0.14 to ++tab[2] itp
Po przeleceniu wszystkich pikseli, w 'tab' masz histogram X - czyli rozklad/statystyke wartosci X jakie trafialy sie w bitmapie.

0

czyli paleta mi nic nie daje, potrzebuje dane obrazowe?...tylko jak je dostać?
no a powiedzmy jak pobrać numery kolorów w tym programie piksel po pikselu??

void screen(HWND okno, char* plik)
{
HDC _dc = GetWindowDC(okno);
RECT re;
GetWindowRect(okno,&re);
int w = re.right, h = re.bottom;
HDC dc = CreateCompatibleDC(0);
HBITMAP bm = CreateCompatibleBitmap(_dc,w,h);
SelectObject(dc,bm);
StretchBlt(dc,0,0,w,h,_dc,0,0,w,h,SRCCOPY);
void* f = CreateFile(plik,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,0);
void* buf = new char[w*h*4];
GetObject(bm,84,buf);
HDC ddd = GetDC(0);
HDC dc2 = CreateCompatibleDC(ddd);
tagBITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = w;
bi.bmiHeader.biHeight = h;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = 0;
bi.bmiHeader.biSizeImage = 0;

CreateDIBSection(dc,&bi,DIB_RGB_COLORS,&buf,0,0);
GetDIBits(dc,bm,0,h,buf,&bi,DIB_RGB_COLORS);

BITMAPFILEHEADER bif;
bif.bfType = MAKEWORD('B','M');
bif.bfSize = w*h*4+54;
bif.bfOffBits = 54;

BITMAPINFOHEADER bii;
bii.biSize = 40;
bii.biWidth = w;
bii.biHeight = h;
bii.biPlanes = 1;
bii.biBitCount = 32;
bii.biCompression = 0;
bii.biSizeImage = w*h*4;


DWORD r;
WriteFile(f,&bif,sizeof(bif),&r,NULL);
WriteFile(f,&bii,sizeof(bii),&r,NULL);
WriteFile(f,buf,w*h*4,&r,NULL);
CloseHandle(f);
}

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