首页 > 代码库 > Bitmap文件格式+生成一个BMP文件
Bitmap文件格式+生成一个BMP文件
Bitmap的文件格式:
1 #define UINT16 unsigned short 2 #define DWORD unsigned int 3 #define WORD short 4 #define LONG int 5 6 // Bitmap File Header ( 14 Bytes ) 7 typedef struct tagBITMAPFILEHEADER 8 { 9 UINT16 bfType; // same as BM in ASCII.10 DWORD bfSize; // the size of the BMP file in bytes11 UINT16 bfReserved1; 12 UINT16 bfReserved2; 13 DWORD bfOffBits; // starting address, of the byte where the bitmap image data (Pixel Array) can be found.14 } BITMAPFILEHEADER, *PBITMAPFILEHEADER;15 16 // DIB头描述bitmap的信息,包括大小、压缩类型、颜色格式等,DIB头的大小根据版本不同,大小也不同。17 typedef struct tagBITMAPINFOHEADER18 {19 DWORD biSize; // 4, the size of this header (40 bytes)20 LONG biWidth; // 4, the bitmap width in pixels (signed integer).21 LONG biHeight; // 4, the bitmap height in pixels (signed integer).22 WORD biPlanes; // 2, the number of color planes being used. Must be set to 1.23 WORD biBitCount; // 2, the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32.24 DWORD biCompression; // 4, the compression method being used. 25 DWORD biSizeImage; // 4, the image size. This is the size of the raw bitmap data, and should not be confused with the file size.26 LONG biXPelsPerMeter; // 4, the horizontal resolution of the image.27 LONG biYPelsPerMeter; // 4, the vertical resolution of the image. 28 DWORD biClrUsed; // 4, the number of colors in the color palette, or 0 to default to 2^n.29 DWORD biClrImportant; // 4, the number of important colors used, or 0 when every color is important; generally ignored.30 } BITMAPINFOHEADER;
生成一个BMP文件:
1 int bitmap_file_generate( char *name, int width, int height ) 2 { 3 FILE *fp = NULL; 4 unsigned char *pData; 5 unsigned char *pp; 6 int i, j; 7 int iFileSize; 8 9 unsigned char bfType1, bfType2; 10 unsigned int bfSize; 11 unsigned short bfReserved1, bfReserved2; 12 unsigned int bfOffBits; 13 unsigned int biSize; 14 int biWidth, biHeight; 15 unsigned short biPlanes; 16 unsigned short biBitCount; 17 unsigned int biCompression; 18 unsigned int biSizeImage; 19 unsigned int biXPelsPerMeter; 20 unsigned int biYPelsPerMeter; 21 unsigned int biClrUsed; 22 unsigned int biClrImportant; 23 24 // offset[0:1] 25 bfType1 = ‘B‘; 26 bfType2 = ‘M‘; 27 // offset[2:5] 28 bfSize = width * height * 3 + 54; 29 // offset[6:7] 30 bfReserved1 = 0; 31 // offsset[8:9] 32 bfReserved2 = 0; 33 // offset[10:13] 34 bfOffBits = 54; 35 // offset[14:17] 36 biSize = 40; 37 // offset[18:21] 38 biWidth = width; 39 // offset[22:25] 40 biHeight = height; 41 // offset[26:27] 42 biPlanes = 1; 43 // offset[28:29] 44 biBitCount = 24; 45 // offset[30:33] 46 biCompression = 0; 47 // offset[34:37] 48 biSizeImage = width * height * 3; 49 // offset[38:41] 50 biXPelsPerMeter = 2835; 51 // offset[42:45] 52 biYPelsPerMeter = 2835; 53 // offset[46:49] 54 biClrUsed = 0; 55 // offset[50:53] 56 biClrImportant = 0; 57 58 59 fp = fopen(name, "wb+"); 60 if( fp == NULL ) 61 { 62 printf("create file err, fopen: %p\n", fp); 63 return -1; 64 } 65 66 pData = http://www.mamicode.com/(unsigned char *)malloc(biWidth*biHeight*3+54);//malloc(iFileSize); 67 if(pData =http://www.mamicode.com/= NULL) 68 { 69 printf("pData malloc err\n"); 70 return -2; 71 } 72 73 // same as BM in ASCII. 74 pData[0] = bfType1; 75 pData[1] = bfType2; 76 77 // the size of the BMP file in bytes. bmp文件的实际大小 78 pData[2] = (unsigned char)((bfSize>>0) & 0xff); 79 pData[3] = (unsigned char)((bfSize>>8) & 0xff); 80 pData[4] = (unsigned char)((bfSize>>16) & 0xff); 81 pData[5] = (unsigned char)((bfSize>>24) & 0xff); 82 83 // reserved 84 pData[6] = (unsigned char)((bfReserved1>>0) & 0xff); 85 pData[7] = (unsigned char)((bfReserved1>>8) & 0xff); 86 // reserved 87 pData[8] = (unsigned char)((bfReserved2>>0) & 0xff); 88 pData[9] = (unsigned char)((bfReserved2>>0) & 0xff); 89 90 // the offset, i.e. starting address, of the byte where the bitmap image data (Pixel Array) can be found. 91 // 颜色数据的偏移地址,实际为:54 = 14 + 40 92 pData[10] = (unsigned char)((bfOffBits>>0) & 0xff); 93 pData[11] = (unsigned char)((bfOffBits>>8) & 0xff); 94 pData[12] = (unsigned char)((bfOffBits>>16) & 0xff); 95 pData[13] = (unsigned char)((bfOffBits>>24) & 0xff); 96 97 // the size of this header (40 bytes) 98 pData[14] = (unsigned char)((biSize>>0) & 0xff); 99 pData[15] = (unsigned char)((biSize>>8) & 0xff);100 pData[16] = (unsigned char)((biSize>>16) & 0xff); 101 pData[17] = (unsigned char)((biSize>>24) & 0xff);102 103 // the bitmap width in pixels (signed integer).104 pData[18] = (unsigned char)((biWidth>>0) & 0xff);105 pData[19] = (unsigned char)((biWidth>>8) & 0xff);106 pData[20] = (unsigned char)((biWidth>>16) & 0xff);107 pData[21] = (unsigned char)((biWidth>>24) & 0xff);108 109 // the bitmap height in pixels (signed integer).110 pData[22] = (unsigned char)((biHeight>>0) & 0xff);111 pData[23] = (unsigned char)((biHeight>>8) & 0xff);112 pData[24] = (unsigned char)((biHeight>>16) & 0xff);113 pData[25] = (unsigned char)((biHeight>>24) & 0xff);114 115 // the number of color planes being used. Must be set to 1.116 pData[26] = (unsigned char)((biPlanes>>0) & 0xff);117 pData[27] = (unsigned char)((biPlanes>>8) & 0xff);118 119 // the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32.120 pData[28] = (unsigned char)((biBitCount>>0) & 0xff);121 pData[29] = (unsigned char)((biBitCount>>8) & 0xff);122 123 // the compression method being used. See the next table for a list of possible values.124 pData[30] = (unsigned char)((biCompression>>0) & 0xff);125 pData[31] = (unsigned char)((biCompression>>8) & 0xff);126 pData[32] = (unsigned char)((biCompression>>16) & 0xff);127 pData[33] = (unsigned char)((biCompression>>24) & 0xff);128 129 // the image size. This is the size of the raw bitmap data, and should not be confused with the file size.130 pData[34] = (unsigned char)((biSizeImage>>0) & 0xff);131 pData[35] = (unsigned char)((biSizeImage>>8) & 0xff);132 pData[36] = (unsigned char)((biSizeImage>>16) & 0xff);133 pData[37] = (unsigned char)((biSizeImage>>24) & 0xff);134 135 // the horizontal resolution of the image. (pixel per meter, signed integer)136 pData[38] = (unsigned char)((biXPelsPerMeter>>0) & 0xff);137 pData[39] = (unsigned char)((biXPelsPerMeter>>8) & 0xff);138 pData[40] = (unsigned char)((biXPelsPerMeter>>16) & 0xff);139 pData[41] = (unsigned char)((biXPelsPerMeter>>24) & 0xff);140 141 // the vertical resolution of the image. (pixel per meter, signed integer)142 pData[42] = (unsigned char)((biYPelsPerMeter>>0) & 0xff);143 pData[43] = (unsigned char)((biYPelsPerMeter>>8) & 0xff);144 pData[44] = (unsigned char)((biYPelsPerMeter>>16) & 0xff);145 pData[45] = (unsigned char)((biYPelsPerMeter>>24) & 0xff); 146 147 // the number of colors in the color palette, or 0 to default to 2^n.148 pData[46] = (unsigned char)((biClrUsed>>0) & 0xff);149 pData[47] = (unsigned char)((biClrUsed>>8) & 0xff);150 pData[48] = (unsigned char)((biClrUsed>>16) & 0xff);151 pData[49] = (unsigned char)((biClrUsed>>24) & 0xff); 152 153 // the number of important colors used, or 0 when every color is important; generally ignored.154 pData[50] = (unsigned char)((biClrImportant>>0) & 0xff);155 pData[51] = (unsigned char)((biClrImportant>>8) & 0xff);156 pData[52] = (unsigned char)((biClrImportant>>16) & 0xff);157 pData[53] = (unsigned char)((biClrImportant>>24) & 0xff); 158 159 160 pp = &pData[54];161 for(i = 0; i < biHeight; i++)162 {163 for(j = 0; j < biWidth; j++)164 {165 set_color(pp, biWidth, biHeight, i, j, i+j, i, j); // 随便填有点颜色166 }167 } 168 169 iFileSize = fwrite(pData, 1, bfSize, fp);170 printf("generate file iFileSize: %d\n", iFileSize);171 172 free(pData);173 174 fclose(fp);175 176 return 0;177 }
以上生成的BMP,坐标起始位置(0,0)为左下角,填充颜色:
1 void set_color( unsigned char *pp, int w, int h, 2 int x, int y, unsigned char r, unsigned char g, unsigned char b )3 {4 pp[y*w*3+x*3+0] = (unsigned char)r;5 pp[y*w*3+x*3+1] = (unsigned char)g;6 pp[y*w*3+x*3+2] = (unsigned char)b;7 }
生成一个,~~~~(>_<)~~~~:
1 int main(int argc, char *argv[]) 2 { 3 int ret; 4 char *file_name; 5 6 if( argc != 2 ) 7 { 8 printf("please input bitmap file_name\n"); 9 printf("usage: %s bitmap_file_name\n", argv[0]);10 return 0;11 }12 13 file_name = argv[1];14 15 ret = bitmap_file_generate(file_name, 1024*10, 1024*10);16 17 printf("bitmap_file_generate, ret: %d\n", ret);18 19 return 0; 20 }
Bitmap文件格式+生成一个BMP文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。