从内存布局看CreateDIBSection:为什么你的位图绘制总是错位?深度解析BITMAPINFO结构

从内存布局看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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值