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