关于BITMAPINFO中第二个成员RGBQUAD bmiColors[1]的有关问题

BITMAPINFO结构中的RGBQUAD数组通常用于存储调色板数据,其大小可变,一般最多256个条目。通过定义bmiColors[1]作为起点,实际使用时需要额外分配内存以保存足够的调色板信息。在C++中,可以使用动态内存分配创建BITMAPINFO结构,并初始化其成员,包括设置biClrUsed为0表示使用所有颜色。接着,可以填充bmiColors数组,创建一个灰度调色板。
摘要由CSDN通过智能技术生成


typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;


BITMAPINFO结构最后是调色板数据,包含若干个RGBQUAD条目,一般来说最大为256个,定义为长度为1的数组是c语言里常用的一个技巧,用来定义可变长度的结构.你在程序里需要分配够保存调色板的大小,最好把mBitmapInfo定义为一个指针
mBitmapInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256*sizeof(RGBQUAD));


其实:bmiColors[1] 只是给了一个地址,因为BMP种类多,这个数组的程度是可变的。
新语法可以写成:
bmiColors[]; 就是不完全结构。


BITMAPINFO *pBitmapInfo=(BITMAPINFO*)(new char[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)]);

 pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 pBitmapInfo->bmiHeader.biWidth = m_iImageWidth;
 pBitmapInfo->bmiHeader.biHeight = m_iImageHeight;
 pBitmapInfo->bmiHeader.biPlanes=1;

 pBitmapInf

MFC可以使用CBitmap类来显示BITMAPINFO格式的图像。具体步骤如下: 1. 定义一个BITMAPINFO结构体,并初始化其成员变量,例如: ```cpp BITMAPINFO bmpInfo; ZeroMemory(&bmpInfo, sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = 640; // 图像宽度 bmpInfo.bmiHeader.biHeight = -480; // 图像高度(负数表示倒置) bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = 24; // 每个像素点占用的位数,此处为24位真彩色 bmpInfo.bmiHeader.biCompression = BI_RGB; ``` 2. 加载图像数据到内存,例如: ```cpp BYTE* pImgData = new BYTE[640 * 480 * 3]; // 图像数据大小为640*480*3字节 // 从文件读取图像数据 FILE* fp = fopen("test.bmp", "rb"); fseek(fp, 54, SEEK_SET); // BMP文件头大小为54字节 fread(pImgData, 1, 640 * 480 * 3, fp); fclose(fp); ``` 3. 创建一个CBitmap对象,并使用SetBitmapBits函数将图像数据传入,例如: ```cpp CBitmap bmp; bmp.CreateBitmap(640, 480, 1, 24, pImgData); bmp.SetBitmapBits(640 * 480 * 3, pImgData); ``` 4. 将CBitmap对象显示在界面上,例如: ```cpp CClientDC dc(this); // 获取当前窗口的设备上下文 CDC memDC; memDC.CreateCompatibleDC(&dc); // 创建一个与设备上下文兼容的内存上下文 memDC.SelectObject(&bmp); // 将CBitmap对象选入内存上下文 dc.BitBlt(0, 0, 640, 480, &memDC, 0, 0, SRCCOPY); // 将内存上下文的图像复制到设备上下文显示 ``` 完整示例代码如下: ```cpp BITMAPINFO bmpInfo; ZeroMemory(&bmpInfo, sizeof(BITMAPINFO)); bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth = 640; bmpInfo.bmiHeader.biHeight = -480; bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = 24; bmpInfo.bmiHeader.biCompression = BI_RGB; BYTE* pImgData = new BYTE[640 * 480 * 3]; FILE* fp = fopen("test.bmp", "rb"); fseek(fp, 54, SEEK_SET); fread(pImgData, 1, 640 * 480 * 3, fp); fclose(fp); CBitmap bmp; bmp.CreateBitmap(640, 480, 1, 24, pImgData); bmp.SetBitmapBits(640 * 480 * 3, pImgData); CClientDC dc(this); CDC memDC; memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&bmp); dc.BitBlt(0, 0, 640, 480, &memDC, 0, 0, SRCCOPY); delete[] pImgData; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值