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; //写入调色版的颜色号 
不是很明白,就随便生成了颜色,你试试行不

解决方案 »

  1.   

    24位的位图没有调色板,所以,你不需要写调色板信息。
    另外,
    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就可以了
      

  2.   

    顶.
    to livedeal(怀念) 你的代码 Map24 chData[1024][768]回堆栈溢出的。
      

  3.   

    直接使用GDI不是更方便吗?LZ应该参考下GDI里关于Bitmap的那些内容,就算想直接用语言写图像文件,那里对于位图结构的描述也是很有帮助的。没记错位图的文件结构好像是这样的:
    先是一个BITMAPFILEHEADER结构
    接下来是BITMAPINFO结构
    最后是真正的象素信息。其中BITMAPINFO结构根据位图的类型不同有不同的组织方法,256色以下需要调色板,另外有些位图RGB分量也需要在这里指定。
      

  4.   

    用网上类方便,mfc对位图真是麻烦