我可以使用GetObject(...)
从HBITMAP句柄获取BITMAP结构HBITMAP hSrc = // source image
BITMAP bDst;
GetObject(hSrc, sizeof(BITMAP), &bDst);
...
但是想知道是否有办法计算该图像的内存使用量(或占用空间?)。
我不想显示内存大小超过xyz的图片。
typedef struct tagBITMAP
{
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
LPVOID bmBits;包含所有数据,但如何计算void*
指针的大小?
答案 0 :(得分:0)
如果我记得很清楚,足迹是扫描线*高度加上调色板大小,所以它应该是:
bmWidthBytes * bmHeight + bmPlanes * bmBitsPixel
答案 1 :(得分:0)
BITMAP结构是没有调色板信息的旧类型定义。 它仍然是兼容的。 我认为它现在通常由BITMAPINFO定义。
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount; // (1, 4, 8, 16, 24, 32) 24 or lager→RGB, others→using color palette
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
这是CreateDIBSection()API的参数。
BITMAPINFO bmi;
BITMAPFILEHEADER* lpbmpfh = &bmi.bmiHeader;
lpbmpfh->biWidth = width;
lpbmpfh->biHeight = height;
lpbmpfh->biBitCount = 24;
void* lpPixel;
HBITMAP hDib = CreateDIBSection(NULL,&bmi,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0);
此API获取像素区域。 这个尺寸通常是“biBitCount / 8 * width * height”。(在没有托盘的情况下)