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

来源:互联网 发布:原知宏大野智 编辑:程序博客网 时间:2024/06/14 14:30
#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;}

0 0