【问题标题】:Calculate the memory usage of a bitmap using BITMAP使用 BITMAP 计算位图的内存使用情况
【发布时间】:2016-07-07 15:23:39
【问题描述】:

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

【问题讨论】:

  • 你有使用的像素数(就像你有宽度和高度一样),然后你有每个像素的位数。你只需要一些简单的乘法。
  • 大概是 width * height * bitsperpixel / 8。这没什么意义,当你得到这个信息时,损坏已经完成,你已经加载了位图并用完了对它的记忆。所以你不妨展示一下。
  • @JoachimPileborg,你说bmWidth*bmHeight*bmBitsPixel?但是,bmPlanesbmWidthBytes 适合在哪里,或者它们不参与实际大小?
  • @HansPassant,'8' 来自哪里?
  • @SimonGoodman 每字节 8 位。而且结构中有些信息是多余的。

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


【解决方案1】:

如果我没记错的话,脚印是扫描线*高度加上调色板大小,所以应该是:

bmWidthBytes * bmHeight + bmPlanes * bmBitsPixel

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 2023-03-27
      • 1970-01-01
      • 2014-06-03
      • 2016-08-29
      • 2011-07-04
      • 2017-05-08
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多