#include <Windows.h>
#include <fstream>
using namespace std;
long const m_Width = 32;
long const m_Height = 32;
int main()
{
BITMAPFILEHEADER bitmapFileHead;
BITMAPINFOHEADER bitmapInfoHead;
RGBQUAD rgbQuad[256];
int i;
//设置BMP信息头
bitmapInfoHead.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfoHead.biWidth = m_Width;
bitmapInfoHead.biHeight = m_Height;
bitmapInfoHead.biPlanes = 1; // 一个页面, 单层
bitmapInfoHead.biBitCount = 8; //8位彩色,共256色
bitmapInfoHead.biCompression = BI_RGB; //常量,等于0,不压缩
bitmapInfoHead.biSizeImage = m_Width*m_Height;
bitmapInfoHead.biXPelsPerMeter = 9600; //这个值在具有不同像素大小的显示设备上显示相同
bitmapInfoHead.biYPelsPerMeter = 9600;
bitmapInfoHead.biClrUsed = 0; //使用颜色数 , 可写
bitmapInfoHead.biClrImportant = 0; //关键颜色数,可写
//对调色板赋值,得到红色渐变调色板
for(i = 0; i <256; i++)
{
rgbQuad[i].rgbBlue = (BYTE)i; //蓝色亮度
rgbQuad[i].rgbGreen = (BYTE)i; //绿色亮度
rgbQuad[i].rgbRed = (BYTE)i; //红色亮度
rgbQuad[i].rgbReserved = 0; //保留位
}
//位图信息
char chData[32][32];
FillMemory(&chData, sizeof(chData), 0); //清零
for(i = 0; i < 32;i++)
{
for(int j = 0; j<32; j++)
{
chData[i][j] = i * 8; // 写入调色板中的颜色号
}
}
//对文件头进行赋值
bitmapFileHead.bfType = (WORD)0x4D42; // "BM"
bitmapFileHead.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256 + m_Width*m_Height);
bitmapFileHead.bfReserved1 = 0; //保留
bitmapFileHead.bfReserved2 = 0; //保留
bitmapFileHead.bfOffBits = (DWORD)(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
//打开输出文件
fstream fout;
fout.open("test.bmp", ios::out|ios::binary);
if(!fout.good())
{
MessageBox(NULL, "文件打开失败", "提示", MB_ICONINFORMATION);
return -1;
}
//写入
fout.write((char*)&bitmapFileHead, sizeof(BITMAPFILEHEADER)); //写文件头
fout.write((char*)&bitmapInfoHead, sizeof(BITMAPINFOHEADER)); //写信息头
fout.write((char*)&rgbQuad, sizeof(RGBQUAD)*256); //写调色版
fout.write((char*)&chData, m_Width*m_Height); //写数据
fout.close();
return 0;
}