Использование BitBlt для захвата пикселей на рабочем столе - PullRequest
0 голосов
/ 29 декабря 2010

Прямо сейчас я использую GetPixel () для получения около 64 пикселей с рабочего стола, чтобы получить их цвет.Я читал о том, что GetPixel () работает медленно, но не думал, что это будет иметь значение для нескольких пикселей, но это занимает 1,5 секунды каждый раз, когда я запускаю процедуру.Проведя некоторые исследования, я пришел к выводу, что битблт кажется тем, что я ищу.Что я хочу сделать, это захватить определенную область рабочего стола (включая все окна), а затем захватить цвета пикселей с заданными смещениями.Вот что я делаю сейчас:

     for (y=0;y<=7;y++) {
     for (x=0;x<=7;x++) {
     //gameScreen is a struct containing the offset from the top left of the monitor
     //to the area of the screen I need
         grid[y][x]=getColor(gameScreen.x+((x*40)+20),gameScreen.y+((y*40)+20));
         }
     }

int getColor(int x, int y) {
//create new point at given coordinates
POINT point;
point.x=x;
point.y=y;
//convert to logical points
DPtoLP(desktopDC,&point,2);
//get pixel color
//desktopDC is an HDC from GetWindowDC(GetDesktopWindow())
int pixel=GetPixel(desktopDC,point.x,point.y);
return pixel;

}

Я нашел приличное количество учебников и документации, но, будучи настолько новым для Windows API, они не работают смного для меня.Спасибо!

1 Ответ

3 голосов
/ 29 декабря 2010

Вы, вероятно, хотите:

  • CreateCompatibleDC
  • CreateCompatibleBitmap
  • SelectObject, сохранение исходного растрового изображения
  • BitBlt
  • GetDIBits
  • SelectObject, возвращение оригинального растрового изображения
  • DeleteBitmap
  • DeleteDC

Если вы делаете это периодически, то первые три шага следует выполнить только один раз, повторите BitBlt и GetDIBits и последние три шага после завершения вашей программы.

...