You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HBITMAP复制到自定义Windows窗口缓冲区?

将HBITMAP复制到自定义缓冲区的方法

你可以通过GetDIBits函数把HBITMAP的像素数据提取出来,直接写入你用VirtualAlloc()分配的缓冲区。核心逻辑是把设备相关的HBITMAP转换成设备无关的像素数据,再同步到你的自定义缓冲区中。下面是具体步骤和代码示例:

步骤详解

  1. 获取HBITMAP基础参数
    用GetObject()读取HBITMAP的宽、高、位深等信息,为后续计算和配置提供依据。

  2. 计算行字节对齐值
    Windows的DIB要求每行像素数据对齐到4字节,必须先算出每行实际占用的字节数,避免数据错位。

  3. 配置BITMAPINFO结构体
    这个结构体用来指定你需要的像素格式(比如24位RGB、32位RGBA)和图像尺寸,让GetDIBits知道如何输出数据。

  4. 绑定HBITMAP到兼容DC
    HBITMAP是设备相关位图,必须先选入兼容DC,才能读取其像素数据。

  5. 提取数据到自定义缓冲区
    调用GetDIBits把HBITMAP的像素数据直接写入你预分配的缓冲区。

代码示例

假设你已经有HBITMAP hBitmap和VirtualAlloc()分配好的缓冲区指针BYTE* pMyBuffer,可以参考以下代码:

// 1. 获取HBITMAP的基本信息
BITMAP bmp{};
GetObject(hBitmap, sizeof(BITMAP), &bmp);

// 2. 计算DIB每行的字节数(对齐到4字节)
int bytesPerLine = ((bmp.bmWidth * bmp.bmBitsPixel + 31) / 32) * 4;

// 3. 配置BITMAPINFO(以24位RGB为例,需和你的缓冲区格式匹配)
BITMAPINFO bmi{};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = bmp.bmWidth;
bmi.bmiHeader.biHeight = -bmp.bmHeight; // 负数值表示像素从上到下排列,和你手动填充的顺序一致
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24; // 根据你的缓冲区格式调整(比如32位RGBA就设为32)
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = bytesPerLine * bmp.bmHeight;

// 4. 创建兼容DC并绑定HBITMAP
HDC hdcScreen = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC(hdcScreen);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hdcMem, hBitmap);

// 5. 将HBITMAP像素数据复制到自定义缓冲区
GetDIBits(hdcMem, hBitmap, 0, bmp.bmHeight, pMyBuffer, &bmi, DIB_RGB_COLORS);

// 6. 清理资源,避免内存泄漏
SelectObject(hdcMem, hOldBitmap);
DeleteDC(hdcMem);
ReleaseDC(NULL, hdcScreen);

注意事项

  • 缓冲区大小检查:确保VirtualAlloc()分配的缓冲区大小 ≥ bytesPerLine * bmp.bmHeight,否则会触发内存越界。
  • 像素格式匹配:如果你的缓冲区是32位RGBA格式,要把biBitCount改成32;若HBITMAP格式和缓冲区不一致,需要额外做格式转换(初学者建议先从格式一致的场景入手)。
  • 像素顺序问题:biHeight设为负数时,输出的像素顺序和你手动填充客户区的顺序一致;设为正数会导致像素上下颠倒,显示时图像翻转。
  • 尺寸适配:如果HBITMAP和缓冲区尺寸不一致,可以先把HBITMAP绘制到和缓冲区同尺寸的兼容DC,再提取数据;或者后续用StretchDIBits显示时直接缩放。

内容的提问来源于stack exchange,提问作者Nicholas Fresta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:13:44