BMP文件格式由:BMP文件头,BMP信息头,调色板,位图数据组成。
下面程序演示创建简单的位图文件:
// createbitmap.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <fstream>
using namespace std;
long const m_Width=32;
long const m_Height=32;
int _tmain(int argc, _TCHAR* argv[])
...{
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; //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=00;//关键颜色数
//对调色板赋值
for(i=0;i<256;i++)...{
rgbQuad[i].rgbBlue=(BYTE)i;
rgbQuad[i].rgbGreen=(BYTE)i;
rgbQuad[i].rgbRed=255;
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=(WORD)(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,(LPCWSTR)"文件打开失败",(LPCWSTR)"提示",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;
}
//
#include "stdafx.h"
#include <windows.h>
#include <fstream>
using namespace std;
long const m_Width=32;
long const m_Height=32;
int _tmain(int argc, _TCHAR* argv[])
...{
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; //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=00;//关键颜色数
//对调色板赋值
for(i=0;i<256;i++)...{
rgbQuad[i].rgbBlue=(BYTE)i;
rgbQuad[i].rgbGreen=(BYTE)i;
rgbQuad[i].rgbRed=255;
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=(WORD)(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,(LPCWSTR)"文件打开失败",(LPCWSTR)"提示",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;
}