Verwenden von Bitblt zum Erfassen von Desktop -Pixelfarben
Frage
Im Moment verwende ich GetPixel (), um etwa 64 Pixel vom Desktop abzurufen, um ihre Farbe zu erhalten. Ich habe über GetPixel gelesen () langsam, aber ich dachte nicht, dass es für ein paar Pixel von Bedeutung wäre, aber es dauert 1,5 Sekunden jedes Mal, wenn ich die Routine betreibe. Nachdem ich einige Nachforschungen angestellt habe, bin ich zu dem Schluss gekommen, dass Bitblt das zu sein scheint, wonach ich suche. Ich möchte einen definierten Bereich des Desktops (einschließlich aller Fenster) und dann Pixelfarben bei gegebenen Offsets schnappen. Hier ist, was ich jetzt mache:
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;
}
Ich habe eine anständige Menge an Tutorial und Dokumentation gefunden, aber so neu in der Windows -API, die sie für mich nicht viel tun. Vielen Dank!
Lösung
Sie wollen wahrscheinlich:
- CreateCompatibledc
- CreateCompatibleBitMap
- SelectObject, speichern Sie die ursprüngliche Bitmap
- Bitblt
- Getibits
- SelectObject und die ursprüngliche Bitmap zurücklegen
- DeletBitmap
- Deletedc
Wenn Sie dies regelmäßig tun, sollten Sie die ersten drei Schritte nur einmal ausführen, wiederholen Sie BitBlt
und GetDIBits
, und die letzten drei, wenn Ihr Programm endet.