现在的位置: 首页 > 综合 > 正文

BMP文件格式及创建简单位图

2013年10月15日 ⁄ 综合 ⁄ 共 2042字 ⁄ 字号 评论关闭

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;
}

 

 

抱歉!评论已关闭.