bmp格式图像有一个特点就是这类数据被分为四个部分:
1.位图文件头(Bitmap File Header) ,大小:14字节
主要包括位图文件大小和位图文件类型信息
2.位图信息头(Bitmap Info Header),大小:40字节
主要包括:位图的宽度和高度,像素为单位、每个像素所占位数(1黑白图像),(4-16色图)、(8-256色图)、(24-真彩色图),新的BMP格式可以支持32位色。 还有其它水平和垂直分辨力(单位:像素/米)等
3.颜色表(Color Map),大小:4个字节
三大类:蓝色分量、绿色分量、红色分量
4.位图数据(Data Body)
对于2色位图用1位就可以表示该像素,那么1个字节就可以储存8个像素的颜色值
对于16色位图,用4个字节表示一个像素颜色,那么一个字节可以储存2个像素颜色值
对于256色位图,1个字节刚好储存1个像素的颜色值
对于真彩色位图,则需要3个字节才能表示一个像素的颜色值
1.读bmp图像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
bool readBmp( char *bmpName) { //二进制读方式打开指定的图像文件 FILE *fp= fopen (bmpName, "rb" ); if (fp==0) return 0; //跳过位图文件头结构BITMAPFILEHEADER fseek (fp, sizeof (BITMAPFILEHEADER),0); //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中 BITMAPINFOHEADER head; fread (&head, sizeof (BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息 bmpWidth = head.biWidth; bmpHeight = head.biHeight; biBitCount = head.biBitCount; //定义变量,计算图像每行像素所占的字节数(必须是4的倍数) int lineByte=(bmpWidth * biBitCount/8+3)/4*4; //灰度图像有颜色表,且颜色表表项为256 if (biBitCount==8){ //申请颜色表所需要的空间,读颜色表进内存 pColorTable= new RGBQUAD[256]; fread (pColorTable, sizeof (RGBQUAD),256,fp); } //申请位图数据所需要的空间,读位图数据进内存 pBmpBuf= new unsigned char [lineByte * bmpHeight]; fread (pBmpBuf,1,lineByte * bmpHeight,fp); //关闭文件 fclose (fp); return 1; } |
2.写bmp图像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
bool saveBmp( char *bmpName, unsigned char *imgBuf, int width, int height, int biBitCount, RGBQUAD *pColorTable) { //如果位图数据指针为0,则没有数据传入,函数返回 if (!imgBuf) return 0; //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0 int colorTablesize=0; if (biBitCount==8) colorTablesize=1024; //待存储图像数据每行字节数为4的倍数 int lineByte=(width * biBitCount/8+3)/4*4; //以二进制写的方式打开文件 FILE *fp= fopen (bmpName, "wb" ); if (fp==0) return 0; //申请位图文件头结构变量,填写文件头信息 BITMAPFILEHEADER fileHead; fileHead.bfType = 0x4D42; //bmp类型 //bfSize是图像文件4个组成部分之和 fileHead.bfSize= sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + colorTablesize + lineByte*height; fileHead.bfReserved1 = 0; fileHead.bfReserved2 = 0; //bfOffBits是图像文件前三个部分所需空间之和 fileHead.bfOffBits=54+colorTablesize; //写文件头进文件 fwrite (&fileHead, sizeof (BITMAPFILEHEADER),1, fp); //申请位图信息头结构变量,填写信息头信息 BITMAPINFOHEADER head; head.biBitCount=biBitCount; head.biClrImportant=0; head.biClrUsed=0; head.biCompression=0; head.biHeight=height; head.biPlanes=1; head.biSize=40; head.biSizeImage=lineByte*height; head.biWidth=width; head.biXPelsPerMeter=0; head.biYPelsPerMeter=0; //写位图信息头进内存 fwrite (&head, sizeof (BITMAPINFOHEADER),1, fp); //如果灰度图像,有颜色表,写入文件 if (biBitCount==8) fwrite (pColorTable, sizeof (RGBQUAD),256, fp); //写位图数据进文件 fwrite (imgBuf, height*lineByte, 1, fp); //关闭文件 fclose (fp); return 1; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/yuupengsun/article/details/105983528