1.
位圖格式
位**件主要分為4個部分組成:檔案頭,資訊頭,調色盤,影象資料。
檔案頭
結構定義如下:
typedef struct tagbitmapfileheader
bitmapfileheader ;
2.)資訊頭;
結構定義如下:
typedef struct tagbitmapinfoheader
bitmapinfoheader;
3.)調色盤
每個調色盤元素的結構體定義如下:
typedef struct tagrgbquad
rgbquad;
對於高位位圖,將沒有調色盤存在.
4.)影象資料
包含實際的影象資料,n位位圖,每n bits表示乙個畫素的值,按從下到上行優先儲存,同時每行按4位元組對齊.
5.)讀取位**件
開啟檔案 :
file * fbmp = _tfopen(filename,_t("rb"));
讀取檔案頭:
bitmapfileheader fileheader;
fread(&fileheader,sizeof(bitmapfileheader),1,fbmp);
讀取資訊頭:
bitmapinfoheader infoheader;
fread(&infoheader,sizeof(bitmapinfoheader),1,fbmp);
讀取調色盤(以256色為例,調色盤有256項):
rgbquad quard[256] ;
fread(quard,sizeof(rgbquard),256,fbmp);
讀取影象資料:
int ndatalen = (((infoheader.biwidth*infoheader.bibitcount/8) + 3)
/ 4) * 4 * infoheader.biheight ;
byte * pbydatabuf = new byte[ ndatalen ] ;
fseek(fbmp,fileheader.bfoffbits,seek_set);
fread(pbydatabuf ,ndatalen ,1,fbmp);
2.八叉樹演算法
使用八叉樹演算法實現真彩色(24bits)轉256色.要實現此功能,主要就是從真彩色中查詢出最能代表整張影象的256種顏色,建立調色盤.八叉樹就是為了找出這256種顏色.
1.)建立八叉樹
八叉樹節點的特性就是每個節點最多有8個字節點,編號為0~7 .
以rgb值建立八叉樹,首先建立根節點(root),然後分別以rgb的每一位分別組成乙個0~7的值,依次插入樹中。以rgb(123,54,78)為例,
以此類推,將所有的rgb值逐層插入到八叉樹中,在每個節點上,記錄所有經過的節點的rgb值的總和,已及rgb顏色個數。八叉樹節點結構如下:
typedef struct tagnode
snode ;
插入的過程中,如果節點不存在,則需要建立新的節點,然後增加節點計數以及rgb各分量的總和.當在插入時,發現節點已經存在,且是葉子節點,則停止該顏色後續層數節點的插入。插入完乙個顏色之後,如果葉子節點數超過了我們要得到的顏色數(256色需要得到256種顏色),這時候就需要合併一些呀字節點了,使的葉子節點的個數不超過我們要得到的顏色數。
由於越底層的節點,資料的敏感度越低,所以,我們將從最底層的節點開始合併。按節點計數值小的優先合併策略,將其字節點的所有rgb分量以及節點計數全部記錄到該節點中,並刪除其所有子節點。依此進行,直到合併後的葉子數符合要求為止。
2.)提取調色盤
按照上述的步驟插入完所有的顏色之後,便建立起一顆葉子節點不超過256的八叉樹。此時,取出葉子節點中的rgb分量的平均值(分量總和/ 節點計數),即是得到的調色盤顏色值。
3.)匹配調色盤索引
所謂匹配調色盤索引,就是根據原始的rgb值,在調色盤中查詢出最接近的顏色的索引。對每個rgb顏色,分別對調色盤資料求各分量的差值的平方和,求的的最小值對應的調色盤顏色的索引,即是該rgb顏色匹配到的調色盤索引
24 32位真彩色
24 32位真彩色 1.24位定位 dword pixel addr 3 x y lpitch video buffer pixel addr blue video buffer pixel addr 1 green video buffer pixel addr 2 red 知識回顧 lpitch...
真彩色與偽彩色的概念
真彩色簡介 真彩色是指影象中的每個畫素 值都分成r g b三個基色分量,每個基色分量直接決定其基 色的強度,這樣產生的色彩稱為真彩色。計算機表示顏色也是用二進位制 16位色的髮色總數是65536色,也就是2的16次方 24位色被稱為真彩色,它可以達到人眼分辨的極限,髮色數是1677萬多色,也就是2的...
真彩色調色盤
執行開始 紅色綠色 藍色黑色 public class frmmain inherits system.windows.forms.form private sub frmmain load byval sender as system.object,byval e as system.eventa...