GetDIBits renvoi les pixels à partir du bas à gauche de l'écran, vers le haut... Plus d'informations sur Top-Down vs. Bottom-Up DIBs.

Petite astuce obscure pour forcer la récupération des pixels de manière normale pour nous, c'est-à-dire du haut vers le bas, il suffit de déclarer la taille du bitmap négative. Voici un pseudo code C :

bmi = BITMAPINFO()
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER)
bmi.bmiHeader.biWidth = width
bmi.bmiHeader.biHeight = -height  /* c'est ici que la magie opère */
bmi.bmiHeader.biPlanes = 1
bmi.bmiHeader.biBitCount = 24
bmi.bmiHeader.biCompression = BI_RGB

srcdc = GetWindowDC(0)
memdc = CreateCompatibleDC(srcdc)
bmp = CreateCompatibleBitmap(srcdc, width, height)
SelectObject(memdc, bmp)
BitBlt(memdc, 0, 0, width, height, srcdc, left, top, SRCCOPY)
image = create_string_buffer(width * height * 3)
GetDIBits(memdc, bmp, 0, height, image, bmi, DIB_RGB_COLORS)

bmi.bmiHeader.biHeight = -height permet de spécifier la hauteur de l'image, mais étant donné qu'elle est négative, les données en mémoire renvoyées par GetDIBits seront telles qu'on a l'habitude de le concevoir.