BMP真彩色轉256色

2021-07-03 16:00:03 字數 2598 閱讀 4000

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...