#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)//計(jì)算圖像每行象素所占的字節(jié)數(shù)目
位圖數(shù)據(jù)記錄了位圖的每一個(gè)像素值或該對(duì)應(yīng)像素的顏色表的索引值,圖像記錄順序是在掃描行內(nèi)是從左到右,掃描行之間是從下到上。這種格式我們又稱(chēng)為Bottom_Up位圖,當(dāng)然與之相對(duì)的還有Up_Down形式的位圖,它的記錄順序是從上到下的,對(duì)于這種形式的位圖,也不存在壓縮形式。位圖的一個(gè)像素值所占的字節(jié)數(shù):當(dāng)biBitCount=1時(shí),8個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=4時(shí),2個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=8時(shí),1個(gè)像素占1個(gè)字節(jié);當(dāng)biBitCount=24時(shí),1個(gè)像素占3個(gè)字節(jié),此時(shí)圖像為真彩色圖像。當(dāng)圖像不是為真彩色時(shí),圖像文件中包含顏色表,位圖的數(shù)據(jù)表示對(duì)應(yīng)像素點(diǎn)在顏色表中相應(yīng)的索引值,當(dāng)為真彩色時(shí),每一個(gè)像素用三個(gè)字節(jié)表示圖像相應(yīng)像素點(diǎn)彩色值,每個(gè)字節(jié)分別對(duì)應(yīng)R、G、B分量的值,這時(shí)候圖像文件中沒(méi)有顏色表。上面我已經(jīng)講過(guò)了,Windows規(guī)定圖像文件中一個(gè)掃描行所占的字節(jié)數(shù)必須是4的倍數(shù)(即以字為單位),不足的以0填充,圖像文件中一個(gè)掃描行所占的字節(jié)數(shù)計(jì)算方法:
DataSizePerLine= (biWidth* biBitCount+31)/32*4;// 一個(gè)掃描行所占的字節(jié)數(shù)
最主要是/32*4而不能直接/8,見(jiàn)下面例子
舉一個(gè)例子,對(duì)于2色圖,如果圖象寬(每行像素?cái)?shù))是31,則每一行需要31位存儲(chǔ)(對(duì)于2色圖是每個(gè)像素占一位),合3個(gè)字節(jié)加7位,因?yàn)樽止?jié)數(shù)必須是4的整倍數(shù),所以應(yīng)該是4,而此時(shí)biWidth=31,biBitCount=1,WIDTHBYTES(31*1)=(31+31)/32*4=62/32*4=1*4=4,和我們?cè)O(shè)想的一樣。再舉一個(gè)256色的例子,如果圖象寬(每行像素?cái)?shù))是31,則每一行需要31個(gè)字節(jié)存儲(chǔ)(對(duì)于256色圖是每個(gè)像素占8位即一個(gè)字節(jié)),因?yàn)樽止?jié)數(shù)必須是4的整倍數(shù),所以應(yīng)該是32,而此時(shí)的biWidth=31,biBitCount=8,WIDTHBYTES(31*8)=(31*8+31)/32*4=31*9/32*4=279/32*4=8*4=32
聯(lián)系客服