Je travaille sur une idée qui consiste à obtenir une capture complète de l'écran, y compris les fenêtres et les applications, en l'analysant, puis en retraçant les éléments sur l'écran, en superposition. Je veux apprendre les techniques de traitement d'image et je pourrais obtenir beaucoup de données pour travailler si je peux accéder directement à l'écran de Windows. Je pourrais utiliser cela pour construire des outils d'automatisation dont on n'a jamais vu auparavant. Plus sur cela plus tard.Exécution de capture plein écran dans Windows
La capture en plein écran fonctionne pour l'essentiel.
HWND hwind = GetDesktopWindow();
HDC hdc = GetDC(hwind);
int resx = GetSystemMetrics(SM_CXSCREEN);
int resy = GetSystemMetrics(SM_CYSCREEN);
int BitsPerPixel = GetDeviceCaps(hdc,BITSPIXEL);
HDC hdc2 = CreateCompatibleDC(hdc);
BITMAPINFO info;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = resx;
info.bmiHeader.biHeight = resy;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = BitsPerPixel;
info.bmiHeader.biCompression = BI_RGB;
void *data;
hbitmap = CreateDIBSection(hdc2,&info,DIB_RGB_COLORS,(void**)&data,0,0);
SelectObject(hdc2,hbitmap);
Une fois cela fait, je peux appeler cela à plusieurs reprises:
BitBlt(hdc2,0,0,resx,resy,hdc,0,0,SRCCOPY);
Le code de nettoyage (Je ne sais pas si cela est correct):
DeleteObject(hbitmap);
ReleaseDC(hwind,hdc);
if (hdc2) {
DeleteDC(hdc2);
}
Chaque BitBlt temps est appelé il saisit l'écran et l'enregistre en mémoire, je peux accéder à data
.
Les performances sont plutôt satisfaisantes. BitBlt s'exécute en 50 millisecondes (parfois aussi bas que 33ms) à 1920x1200x32. Ce qui me surprend, c'est que lorsque je passe le mode d'affichage à 16 bits, 1920x1200x16, soit par mes paramètres graphiques, soit en utilisant ChangeDisplaySettings
, j'obtiens un temps de capture d'écran massivement amélioré entre 1ms et 2ms, qui ne peut pas être expliqué par le facteur de deux réduction de la profondeur de bits. En utilisant CreateDIBSection
(comme ci-dessus) offre une accélération significative en mode 16 bits, par rapport à si je configure avec CreateCompatibleBitmap
(6-7ms/f).
Est-ce que quelqu'un sait pourquoi la chute en 16bit provoque une telle augmentation de la vitesse? Y a-t-il un espoir pour moi d'attraper 32 bits à de telles vitesses? si ce n'est pas pour la profondeur de couleur, mais pour ne pas forcer un changement des modes de tampon de l'écran et le scintillement terrible.
ouais pourquoi Aero tombe à aimer 15 fps Je n'ai aucune idée ... – rogerdpack