......
BITMAPINFOHEADER bi; bi.biSize
= sizeof(BITMAPINFOHEADER); bi.biWidth = bmpScreen.bmWidth; bi.biHeight = bmpScreen.bmHeight; bi.biPlanes = 1; bi.biBitCount = bmpScreen.bmBitsPixel;
bi.biCompression
= BI_RGB;
bi.biSizeImage
= 0;
bi.biXPelsPerMeter
= 0;
bi.biYPelsPerMeter
= 0;
bi.biClrUsed
= 0;
bi.biClrImportant
= 0;

DWORD dwBmpSize
= ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight; cBmpData = new unsigned char[dwBmpSize ];

GetDIBits(hdcScreen, hbmScreen,
0, (UINT)bmpScreen.bmHeight, cBmpData, (BITMAPINFO *)&bi, DIB_RGB_COLORS);

DeleteObject(
bmpScreen);

ReleaseDC(hdcScreen);

return cBmpData;
}
<---运行到这里时提示堆栈损坏

这是因为其实GetDIBits的第五个参数需要的其实是一个BITMAPINFO结构,而我们传入的是BITMAPINFOHEADER。

如果在位图不小于16位时,这是可行的。但是在位图小于16位时,它还需要另外的内存空间来储存一个调色板数据,所以就会发生堆栈损坏的错误。

正确的做法是这样的

struct { BITMAPINFO info; RGBQUAD moreColors[255]; } fbi;
BITMAPINFOHEADER &bi = fbi.info.bmiHeader;
bi.biSize = sizeof(BITMAPINFOHEADER);
...
GetDIBits(..., &fbi.info, ...);

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!