用C++语言写bmp文件的程序完整版

#include <stdio.h>
#include <stdlib.h>

/* 定义WORD为两个字节的类型 */
typedef unsigned short WORD;
/* 定义DWORD为四个字节的类型 */
typedef unsigned long DWORD;

/* 位图文件头主要是对位图文件的一些描述 位图信息头主要是对位图图像方面信息的描述 */
/*************************** 位图标准信息(54字节) ******************************************/
/* 位图文件头 (位图头的字节数 = 位图文件字节数 - 位图图像数据字节数)*/
/* MBP图像数据 (图像数据字节数 = 图像宽度*图像高度*(每个像素的位数/8))*/
typedef struct BMP_FILE_HEADER
{
	WORD bType;      // 文件标识符 
	DWORD bSize;     // 文件的大小 
	WORD bReserved1; // 保留值,必须设置为0  
	WORD bReserved2; // 保留值,必须设置为0 
	DWORD bOffset;   // 文件头的最后到图像数据位开始的偏移量 
} BMPFILEHEADER;     // 14 字节

/* 位图信息头 */
typedef struct BMP_INFO
{
	DWORD bInfoSize;            // 信息头的大小   
	DWORD bWidth;               // 图像的宽度     
	DWORD bHeight;              // 图像的高度     
	WORD bPlanes;               // 图像的位面数   
	WORD bBitCount;             // 每个像素的位数 
	DWORD bCompression;         // 压缩类型 
	DWORD bmpImageSize;         // 图像的大小,以字节为单位 
	DWORD bXPelsPerMeter;       // 水平分辨率 
	DWORD bYPelsPerMeter;       // 垂直分辨率 
	DWORD bClrUsed;             // 使用的色彩数 
	DWORD bClrImportant;        // 重要的颜色数 
} BMPINF;            // 40 字节

/* 彩色表:调色板 */
typedef struct RGB_QUAD 
{
	char rgbBlue;     // 蓝色强度 
	char rgbGreen;    // 绿色强度 
	char rgbRed;      // 红色强度 
} RGBQUAD;


int main()
{
	int count = sizeof(BMPFILEHEADER);
	FILE *fp;                     // 定义一个文件指针
	BMPFILEHEADER bmpFileHeader;  // 定义一个 BMP 文件头的结构体
	BMPINF bmpInfo;               // 定义一个 BMP 文件信息结构体 


	// "wb" 以二进制形式写入文件,只允许读数据。'b'指的是让这个库函数以二进制形式打开此文件。
	// 读取失败会返回空指针,读取成功后,fp 会指向一块具有 bmp 属性的内存,我们可以对这块内存开始操作
	// 没有的话自动创建该文件
	if((fp = fopen("kilyc.bmp", "wb")) == NULL) 
	{
		printf("Cann't open the file!\n");
		return 0;
	}
	
	
	bmpInfo.bInfoSize = 40;
	bmpInfo.bHeight = 300;
	bmpInfo.bWidth = 300;
	bmpInfo.bBitCount = 24;
	bmpInfo.bmpImageSize = bmpInfo.bHeight*bmpInfo.bWidth*bmpInfo.bBitCount/8;
	bmpInfo.bCompression = 0;
	bmpInfo.bClrImportant = 0;
	bmpInfo.bClrUsed = 0;
	bmpInfo.bXPelsPerMeter = 0;
	bmpInfo.bYPelsPerMeter = 0;
	bmpInfo.bPlanes = 1; // 调色板数量

	bmpFileHeader.bType = 0x4D42;
	bmpFileHeader.bOffset = 54;
	bmpFileHeader.bSize = bmpInfo.bmpImageSize + bmpFileHeader.bOffset;
	bmpFileHeader.bReserved1 = 0;
	bmpFileHeader.bReserved2 = 0;
	
	RGBQUAD image[300][300];
	
	for(int i=0; i<bmpInfo.bWidth; i++)
		for(int j=0; j<bmpInfo.bHeight; j++)
		{
			image[i][j].rgbBlue = 0;
			image[i][j].rgbGreen = 0;
			image[i][j].rgbRed = 255;
		}

	// 让 fp 指向 bmp 文件的开始 
	// 第 2 个参数是偏移量 第三个参数是文件起始地址 所以此函数执行成功后文件指针会指向文件的开始
	fseek(fp, 0, SEEK_SET);                            // fp = 0x00426aa0



	// 写入文件
	fwrite(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp);
	fwrite(&bmpInfo, sizeof(bmpInfo), 1, fp);
	fwrite(image, sizeof(RGBQUAD), bmpInfo.bHeight*bmpInfo.bWidth, fp);



	// 看是否是 1 个字节对齐
	printf("sizeof(bmpFileHeader) = %d\n", sizeof(bmpFileHeader));
	printf("sizeof(bmpInfo) = %d\n", sizeof(bmpInfo));
	printf("sizeof(RGBQUAD)*bmpInfo.bHeight*bmpInfo.bWidth = %d\n\n", sizeof(RGBQUAD)*bmpInfo.bHeight*bmpInfo.bWidth);

	// 输出BMP文件的位图文件头的所有信息
	printf("位图文件头主要是对位图文件的一些描述:BMPFileHeader\n\n");
	printf("文件标识符 = 0X%X\n", bmpFileHeader.bType);
	printf("BMP 文件大小 = %d 字节\n", bmpFileHeader.bSize);
	printf("保留值1 = %d \n", bmpFileHeader.bReserved1);
	printf("保留值2 = %d \n", bmpFileHeader.bReserved2);
	printf("文件头的最后到图像数据位开始的偏移量 = %d 字节\n", bmpFileHeader.bOffset);

	// 输出BMP文件的位图信息头的所有信息
	printf("\n\n位图信息头主要是对位图图像方面信息的描述:BMPInfo\n\n");
	printf("信息头的大小 = %d 字节\n", bmpInfo.bInfoSize);
	printf("位图的高度 = %d \n", bmpInfo.bHeight);
	printf("位图的宽度 = %d \n", bmpInfo.bWidth);
	printf("图像的位面数(位面数是调色板的数量,默认为1个调色板) = %d \n", bmpInfo.bPlanes); 
	printf("每个像素的位数 = %d 位\n", bmpInfo.bBitCount);
	printf("压缩类型 = %d \n", bmpInfo.bCompression);
	printf("图像的大小 = %d 字节\n", bmpInfo.bmpImageSize);
	printf("水平分辨率 = %d \n", bmpInfo.bXPelsPerMeter);
	printf("垂直分辨率 = %d \n", bmpInfo.bYPelsPerMeter);
	printf("使用的色彩数 = %d \n", bmpInfo.bClrUsed);
	printf("重要的色彩数 = %d \n", bmpInfo.bClrImportant);

	printf("\n\n\n压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)");

	fclose(fp);

	while(1);

	return 0;

}

1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除。

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个早起的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值