typedef struct
{
BYTE r;
BYTE g;
BYTE b;
}Map24;static BOOL CreateEmptyBMP(const char *outbmpfile)
{
long const m_Width =1024;
long const m_Height=768;
/// 设置BMP信息头
BITMAPINFOHEADER bitmapInfoHead;
memset(&bitmapInfoHead, 0, sizeof(bitmapInfoHead));
bitmapInfoHead.biSize =sizeof(BITMAPINFOHEADER);
bitmapInfoHead.biWidth =m_Width;
bitmapInfoHead.biHeight =m_Height;
bitmapInfoHead.biPlanes =1; // must be set to 1
bitmapInfoHead.biBitCount =24; //8位色彩,共256色
bitmapInfoHead.biCompression =BI_RGB;//常量0,不压缩
bitmapInfoHead.biSizeImage =0;
bitmapInfoHead.biXPelsPerMeter =0;
bitmapInfoHead.biYPelsPerMeter =0;
bitmapInfoHead.biClrUsed =0;
bitmapInfoHead.biClrImportant =0; /// 位图信息
Map24 chData[1024][768];
FillMemory(&chData,sizeof(chData),0);
for(int i=0;i<1024;i++)
{
for(int j=0;j<768;j++)
{
chData[i][j].r=i%255; //写入调色版的颜色号
chData[i][j].g=i%255;
chData[i][j].b=i%255;
}
}
/// 对bmp格式的文件头进行赋值
BITMAPFILEHEADER bitmapFileHead;
memset(&bitmapFileHead, 0, sizeof(bitmapFileHead));
bitmapFileHead.bfType=(WORD)0x4D42;//"BM"
bitmapFileHead.bfSize=(WORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+m_Width*m_Height*3);
bitmapFileHead.bfReserved1=0;
bitmapFileHead.bfReserved2=0;
bitmapFileHead.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
/// 写入
fstream fout;
fout.open(outbmpfile,ios::out|ios::binary);
if(!fout.good())
return FALSE;
fout.write((char*)&bitmapFileHead,sizeof(BITMAPFILEHEADER));//写入bmp格式的文件头信息
fout.write((char*)&bitmapInfoHead,sizeof(BITMAPINFOHEADER));//写入此bmp的信息头
fout.write((char*)&chData,m_Width*m_Height*3); //写入此bmp的数据
fout.close();
return TRUE;
}
看你的
chData[i][j]=i*8; //写入调色版的颜色号
不是很明白,就随便生成了颜色,你试试行不
{
BYTE r;
BYTE g;
BYTE b;
}Map24;static BOOL CreateEmptyBMP(const char *outbmpfile)
{
long const m_Width =1024;
long const m_Height=768;
/// 设置BMP信息头
BITMAPINFOHEADER bitmapInfoHead;
memset(&bitmapInfoHead, 0, sizeof(bitmapInfoHead));
bitmapInfoHead.biSize =sizeof(BITMAPINFOHEADER);
bitmapInfoHead.biWidth =m_Width;
bitmapInfoHead.biHeight =m_Height;
bitmapInfoHead.biPlanes =1; // must be set to 1
bitmapInfoHead.biBitCount =24; //8位色彩,共256色
bitmapInfoHead.biCompression =BI_RGB;//常量0,不压缩
bitmapInfoHead.biSizeImage =0;
bitmapInfoHead.biXPelsPerMeter =0;
bitmapInfoHead.biYPelsPerMeter =0;
bitmapInfoHead.biClrUsed =0;
bitmapInfoHead.biClrImportant =0; /// 位图信息
Map24 chData[1024][768];
FillMemory(&chData,sizeof(chData),0);
for(int i=0;i<1024;i++)
{
for(int j=0;j<768;j++)
{
chData[i][j].r=i%255; //写入调色版的颜色号
chData[i][j].g=i%255;
chData[i][j].b=i%255;
}
}
/// 对bmp格式的文件头进行赋值
BITMAPFILEHEADER bitmapFileHead;
memset(&bitmapFileHead, 0, sizeof(bitmapFileHead));
bitmapFileHead.bfType=(WORD)0x4D42;//"BM"
bitmapFileHead.bfSize=(WORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+m_Width*m_Height*3);
bitmapFileHead.bfReserved1=0;
bitmapFileHead.bfReserved2=0;
bitmapFileHead.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
/// 写入
fstream fout;
fout.open(outbmpfile,ios::out|ios::binary);
if(!fout.good())
return FALSE;
fout.write((char*)&bitmapFileHead,sizeof(BITMAPFILEHEADER));//写入bmp格式的文件头信息
fout.write((char*)&bitmapInfoHead,sizeof(BITMAPINFOHEADER));//写入此bmp的信息头
fout.write((char*)&chData,m_Width*m_Height*3); //写入此bmp的数据
fout.close();
return TRUE;
}
看你的
chData[i][j]=i*8; //写入调色版的颜色号
不是很明白,就随便生成了颜色,你试试行不
另外,
for(int i=0;i<1024;i++)
{
for(int j=0;j<768;j++)
{
chData[i][j].r=i%255; //写入调色版的颜色号
chData[i][j].g=i%255;
chData[i][j].b=i%255;
}
chData的类型怪怪的,24位的位图数据是有规定的,每个数据都是RGBQUAD型的,里面包含rgbRed,rgbGreen,rgbBlue三向和一个保留向,保留向可以不管,然后往每一项rgb每项里面添数据,每一项都是BYTE型的数据。
最后一起写到磁盘上面,后缀名为.bmp就可以了
to livedeal(怀念) 你的代码 Map24 chData[1024][768]回堆栈溢出的。
先是一个BITMAPFILEHEADER结构
接下来是BITMAPINFO结构
最后是真正的象素信息。其中BITMAPINFO结构根据位图的类型不同有不同的组织方法,256色以下需要调色板,另外有些位图RGB分量也需要在这里指定。