从内存布局看CreateDIBSection:为什么你的位图绘制总是错位?深度解析BITMAPINFO结构
在Windows图形编程中,位图操作是最基础也最容易出错的环节之一。许多开发者在使用CreateDIBSection创建位图时,经常会遇到图像倒置、颜色错乱或内存访问异常等问题。这些问题的根源往往不在于API调用本身,而是对BITMAPINFO结构的内存布局理解不够深入。
1. BITMAPINFO结构的内存布局解析
BITMAPINFO结构是Windows GDI中定义设备无关位图(DIB)的核心数据结构。它由两部分组成:BITMAPINFOHEADER和颜色表。理解这个结构的内存布局对正确使用CreateDIBSection至关重要。
1.1 BITMAPINFOHEADER的关键字段
BITMAPINFOHEADER决定了位图的基本属性和内存排列方式。以下是几个最易引发问题的字段:
typedef struct tagBITMAPINFOHEADER {
DWORD biSize; // 结构体大小,必须为40
LONG biWidth; // 位图宽度(像素)
LONG biHeight; // 位图高度(像素)
WORD biPlanes; // 必须为1
WORD biBitCount; // 每像素位数(1,4,8,16,24,32)
DWORD biCompression; // 压缩方式(通常为BI_RGB)
DWORD biSizeImage; // 图像数据大小(字节)
LONG biXPelsPerMeter; // 水平分辨率
LONG biYPelsPerMeter; // 垂直分辨率
DWORD biClrUsed; // 实际使用的颜色数
DWORD biClrImportant; // 重要颜色数
} BITMAPINFOHEADER;
biHeight字段的正负值直接影响位图扫描线的排列方向:
- 正值:表示自下而上的DIB,扫描线在内存中从最后一行开始存储
- 负值:表示自上而下的DIB,扫描线在内存中从第一行开始存储
1.2 颜色表的内存布局
颜色表紧跟在BITMAPINFOHEADER之后,其格式取决于biBitCount的值:
| 色深(biBitCount) | 颜色表条目数 | 每个像素占用内存 |
|---|---|---|
| 1 (单色) | 2 | 1/8字节 |
| 4 (16色) | 16 |


1081

被折叠的 条评论
为什么被折叠?



