Quelle quantité de mémoire devrait être alloué pour les données DIB reçues de HBITMAP en utilisant la fonction de GetDIBits?
-
25-10-2019 - |
Question
Quelle quantité de mémoire doit être allouée pour les données DIB reçues de HBITMAP en utilisant la fonction de GetDIBits?
La fonction GetDIBits est décrit dans MSDN comme suit:
int GetDIBits(
__in HDC hdc,
__in HBITMAP hbmp,
__in UINT uStartScan,
__in UINT cScanLines,
__out LPVOID lpvBits,
__inout LPBITMAPINFO lpbi,
__in UINT uUsage
);
Cependant, le tampon pour recevoir des données lpvBits doivent être attribuées avant d'appeler GetDIBits, car GetDIBits ne répartit pas automatiquement.
La question est la quantité de mémoire doit être allouée pour recevoir les données DIB? Supposé que la HBITMAP a une largeur et hauteur que Bmp_Width & Bmp_Height; et le bitmap est 32 bits (RVBA).
La solution
Je pense que la façon la plus simple appelle la fonction GetObject () (Et BTW pour obtenir les bits d'image):
BITMAP bmpObject;
GetObject(hBitmap, sizeof(BITMAP), &bmpObject);
Ensuite, vous utilisez simplement les champs Bitmap:
LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;
Soyez au courant de l'alignement whem traitement octets d'images!
Je espère que cela sera utile!
Autres conseils
La mémoire pointée par lpvBits doivent être de la taille d'un temps de ligne de balayage de la hauteur. Chaque ligne de balayage doit être aligné sur une limite de DWORD.
Puisque vous utilisez la couleur 32 bits alors chaque ligne de balayage se satisy naturellement à cette exigence, tant que vous assurer que la première ligne de balayage, à savoir le début du bloc de mémoire, est de 4 octets aligné.
Donc, la réponse, mesurée en octets, est 4 * largeur * hauteur, aligné à démarrer sur une limite de 4 octets.