Quelle quantité de mémoire devrait être alloué pour les données DIB reçues de HBITMAP en utilisant la fonction de GetDIBits?

StackOverflow https://stackoverflow.com/questions/7304749

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).

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top