BMP文件创建

BMP  文件
  位图文件头 (bitmap-file header) BITMAPFILEHEADER bmfh
  位图信息头 (bitmap-information header) BITMAPINFOHEADER bmih
  彩色表 (color table) RGBQUAD aColors[]
  图象数据阵列字节 BYTE aBitmapBits[]


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

}


转载于:https://my.oschina.net/u/241688/blog/89019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值