使用BITMAP计算位图的内存使用情况

时间:2016-03-21 07:52:06

标签: c++ visual-c++ bitmap

我可以使用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*指针的大小?

2 个答案:

答案 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”。(在没有托盘的情况下)