bmp格式圖像有一個特點就是這類數據被分為四個部分:
1.位圖文件頭(Bitmap File Header) ,大小:14字節
主要包括位圖文件大小和位圖文件類型信息
2.位圖信息頭(Bitmap Info Header),大?。?0字節
主要包括:位圖的寬度和高度,像素為單位、每個像素所占位數(1黑白圖像),(4-16色圖)、(8-256色圖)、(24-真彩色圖),新的BMP格式可以支持32位色。 還有其它水平和垂直分辨力(單位:像素/米)等
3.顏色表(Color Map),大?。?個字節
三大類:藍色分量、綠色分量、紅色分量
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