關於C語言的圖片讀取和數據結構:(1)
位圖頭
保存文件的總體信息
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 字節
調色板信息
這部分定義了圖像中所用的顏色。如上所述,位圖圖像一個像素接着一個像素儲存,每個像素使用一個或者多個字節的值表示,所以調色板的目的就是要告訴應用程序這些值所對應的實際顏色。
典型的位圖文件使用RGB彩色模型。在這種模型中,每種顏色都是由不同強度(從0到最大強度)的紅色(R)、綠色(G)和藍色(B)組成的,也就是說,每種顏色都可以使用紅色、綠色和藍色的值所定義。
在位圖文件的實現中,調色板可以包含很多條目,條目個數就是圖像中所使用的顏色的個數。每個條目包含4個字節:其中三個表示紅色、綠色和藍色,第四個字節沒有使用(大多數應用程序將它設爲0)。對於每個字節,數值0表示相應的顏色在當前的圖像文件中沒有使用,而數值255表示那個顏色使用最大的強度。
讀取
讀取可以用
FILE* fp = fopen("./threshold.bmp", "rb");
進行讀取,但是這樣並沒有完整,應當讀取爲數組才能繼續後面的處理
圖的定義
圖在C語言中是一類非線性結構,其形式定義爲:
Graph=(V,R)
其中
V={x|x∈datatype},
R={VR},
VR={<x,y>|P(x,y)&(x,y∈V)}
其中,數據元素成爲頂點,V是頂點的有窮集合,R是邊的有窮集合,就是說圖片是由頂點和邊組成的。
圖的存儲結構
圖主要有四種存儲結構:
鄰接矩陣、鄰接表、鄰接多重表和十字鏈表,主要使用的是鄰接舉證和鄰接表
鄰接矩陣是表示頂點之間的相鄰關係的矩陣,有n個頂點的圖G=(V,E)的鄰接矩陣爲n階方陣,定義爲:
A[i,j]=【1 若<i,j>或<j,i>∈VE】【0 else】
將鄰接矩陣中的0、1換成權值,就是網的臨界矩陣,無向圖的鄰接矩陣是對稱矩陣,頂點的度是鄰接矩陣中第i行的元素1之和,有向圖的鄰接矩陣不一定是對成矩陣,頂點的出度是鄰接矩陣中第i行元素之和,入度是鄰接矩陣中第i列的元素之和。
通過鄰接矩陣可容易判斷頂點是否存在邊界,容易計算頂點的度,但是佔用空間只和頂點個數相關,和邊數無關,在邊數較少的時候,空間浪費較大,一般在頂點數較少且邊數密集時使用鄰接矩陣。
鄰接表是節省空間對鄰接矩陣的優化,這裏就不繼續深入學習了。