| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
Keskustelut - C/C++ - Pixelin löytäminen värin perusteella bitmapistaeditoitu: 15:47 1.11.09 n4wh 15:46 1.11.09 Hei, ongelmia olis hieman tietyn värisen pixelin paikantaminen bmp :ssä. Siis koitan hakea tietyn väristä pistettä näytöllä ja kuulin että GetPixel() on törkeän hidas, joten päädyin tähän. C++ #include <iostream> #include <windows.h> using namespace std; int main() { COLORREF tofind = RGB( 255, 0, 255 ); int screen_width = GetSystemMetrics( SM_CXSCREEN ); int screen_height = GetSystemMetrics( SM_CYSCREEN ); HDC hdc = GetDC( NULL ); HDC hdcMem = CreateCompatibleDC( hdc ); HBITMAP bmp = CreateCompatibleBitmap( hdcMem, screen_width, screen_height ); SelectObject( hdcMem, bmp ); BitBlt( hdcMem , 0, 0, screen_width, screen_height, hdc, 0, 0, SRCCOPY ); } Eli mites sen tietynvärisen pixelin löytäisi? Tässä tapauksessa hex #ff00ff. Grez 18:21 1.11.09 Käyt loopissa läpi nappaamasi bittikartan pisteet ja kun tulee oikea väri vastaan, poistut loopista. Jos tuon toteuttamisessa on ongelmia, niin tarkenna toki hieman että mikä tökkii. weicco 07:32 2.11.09 En oikein ymmärrä miten GetPixel voisi olla hidas... Grez 09:28 2.11.09 Se on tietty suhteellista. Lähinnä jos pitää vaikka työpöydältä löytää tietyn värinen pikseli, niin kestää kauemmin tehdä 4 096 000 API-kutsua kuin pari API-kutsua ja sen jälkeen käydä loopissa läpi ohjelman käsiteltävissä olevasta muistista 4 096 000 kokonaisluvun taulukko. weicco 12:02 2.11.09 Niin joo. En ajatellutkaan, että GetPixel tekee kyselyn device contextiin. Toisaalta voisi kuvitella, että jos context osoittaa bittikarttaan, olisi tilanne sama kuin lukea suoraan muistista arvo. Kääntäjä ehkä voisi jopa kääntää GetPixelin inlineksi silloin. Mutta desktopin (tai siis screen device contextin) lukeminen tosiaan GetPixelillä olisi hullua. Torak 21:49 3.11.09 CreateDIBSection() on taikasana. http://www.codeproject.com/KB/graphics/rplcolor.aspx editoitu: 13:07 4.11.09 n4wh 13:04 4.11.09 Nyt en oikein ymmärrä mitä tuo CreateDIBSection() vaatii ja miten pixeleiden värit saadaan tuossa antamassasi esimerkissä muuttujaan ptPixels ? Kaikki mitä sain irti, on tämä: C++ #include <iostream> #include <windows.h> using namespace std; int main() { COLORREF tofind = RGB( 255, 0, 255 ); int screen_width = GetSystemMetrics( SM_CXSCREEN ); int screen_height = GetSystemMetrics( SM_CYSCREEN ); HDC hdc = GetDC( NULL ); HDC hdcMem = CreateCompatibleDC( hdc ); HBITMAP bmp = CreateCompatibleBitmap( hdcMem, screen_width, screen_height ); SelectObject( hdcMem, bmp ); BitBlt( hdcMem , 0, 0, screen_width, screen_height, hdc, 0, 0, SRCCOPY ); BITMAPINFO bmi; memset(&bmi, 0, sizeof(BITMAPINFOHEADER)); bmi.biSize=sizeof(BITMAPINFOHEADER); bmi.biWidth = screen_width; bmi.biHeight = screen_height; bmi.biCompression = BI_RGB; bmi.biPlanes=1; bmi.biBitCount=32; UINT * ptPixels; HBITMAP DirectBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, (void **)&ptPixels, NULL, 0); } Ja nyt ptPixels sisältää jokaisen pixelin värin järjestyksessä 0 -> 1023999? (1280x800 näyttö) Sitten looppaan sen läpi ja selvitän missä ekaks tärppää ja lasken järjestysluvun perusteella sen sijainnin näytöllä ? Torak 14:05 8.11.09 Hmm no ei pelitä täälläkään :( Esimerkissä on bmi alustettu väärin. |
![]() Haku
|