青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

c++初學(xué)者

專注技術(shù)開發(fā)

(轉(zhuǎn)) bmp圖分析

說到圖片,位圖(Bitmap)當(dāng)然是最簡單的,它Windows顯示圖片的基本格式,其文件擴(kuò)展名為*.BMP。在Windows下,任何各式的圖片文件(包括視頻播放)都要轉(zhuǎn)化為位圖個(gè)時(shí)候才能顯示出來,各種格式的圖片文件也都是在位圖格式的基礎(chǔ)上采用不同的壓縮算法生成的(Flash中使用了適量圖,是按相同顏色區(qū)域存儲的)。

一、下面我們來看看位圖文件(*.BMP)的格式。

位圖文件主要分為如下3個(gè)部分:

塊名稱

對應(yīng)Windows結(jié)構(gòu)體定義

大?。?/span>Byte

文件信息頭

BITMAPFILEHEADER

14

位圖信息頭

BITMAPINFOHEADER

40

RGB顏色陣列

BYTE*

由圖像長寬尺寸決定

1、   文件信息頭BITMAPFILEHEADER

結(jié)構(gòu)體定義如下:

typedef struct tagBITMAPFILEHEADER { /* bmfh */

UINT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;

} BITMAPFILEHEADER;

其中:

bfType

說明文件的類型,該值必需是0x4D42,也就是字符'BM'。

bfSize

說明該位圖文件的大小,用字節(jié)為單位

bfReserved1

保留,必須設(shè)置為0

bfReserved2

保留,必須設(shè)置為0

bfOffBits

說明從文件頭開始到實(shí)際的圖象數(shù)據(jù)之間的字節(jié)的偏移量。這個(gè)參數(shù)是非常有用的,因?yàn)槲粓D信息頭和調(diào)色板的長度會根據(jù)不同情況而變化,所以你可以用這個(gè)偏移值迅速的從文件中讀取到位數(shù)據(jù)。


2、位圖信息頭BITMAPINFOHEADER

結(jié)構(gòu)體定義如下:

typedef struct tagBITMAPINFOHEADER { /* bmih */

DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;

} BITMAPINFOHEADER;

其中:

biSize

說明BITMAPINFOHEADER結(jié)構(gòu)所需要的字?jǐn)?shù)。

biWidth

說明圖象的寬度,以象素為單位。

biHeight

說明圖象的高度,以象素為單位。注:這個(gè)值除了用于描述圖像的高度之外,它還有另一個(gè)用處,就是指明該圖像是倒向的位圖,還是正向的位圖。如果該值是一個(gè)正數(shù),說明圖像是倒向的,如果該值是一個(gè)負(fù)數(shù),則說明圖像是正向的。大多數(shù)的BMP文件都是倒向的位圖,也就是時(shí),高度值是一個(gè)正數(shù)。

biPlanes

為目標(biāo)設(shè)備說明位面數(shù),其值將總是被設(shè)為1。

biBitCount

說明比特?cái)?shù)/象素,其值為1、4、8、16、24、或32。但是由于我們平時(shí)用到的圖像絕大部分是24位和32位的,所以我們討論這兩類圖像。

biCompression

說明圖象數(shù)據(jù)壓縮的類型,同樣我們只討論沒有壓縮的類型:BI_RGB。

biSizeImage

說明圖象的大小,以字節(jié)為單位。當(dāng)用BI_RGB格式時(shí),可設(shè)置為0。

biXPelsPerMeter

說明水平分辨率,用象素/米表示。

biYPelsPerMeter

說明垂直分辨率,用象素/米表示。

biClrUsed

說明位圖實(shí)際使用的彩色表中的顏色索引數(shù)(設(shè)為0的話,則說明使用所有調(diào)色板項(xiàng))。

biClrImportant

說明對圖象顯示有重要影響的顏色索引的數(shù)目,如果是0,表示都重要。

3、RGB顏色陣列

有關(guān)RGB三色空間我想大家都很熟悉,這里我想說的是在Windows下,RGB顏色陣列存儲的格式其實(shí)BGR。也就是說,對于24位的RGB位圖像素?cái)?shù)據(jù)格式是:

藍(lán)色B

綠色G

紅色R

對于32位的RGB位圖像素?cái)?shù)據(jù)格式是:

藍(lán)色B

綠色G

紅色R

透明通道A

透明通道也稱Alpha通道,該值是該像素點(diǎn)的透明屬性,取值在0(全透明)到255(不透明)之間。對于24位的圖像來說,因?yàn)闆]有Alpha通道,故整個(gè)圖像都不透明。

二、搞清了文件格式,下一步我們要實(shí)現(xiàn)加載。

            加載文件的目的是要得到圖片屬性,以及RGB數(shù)據(jù),然后可以將其繪制在DC(GDI),或是生成紋理對象(3D:OpenGL/Direct3D)。這兩種用途在數(shù)據(jù)處理上有點(diǎn)區(qū)別,我們主要按前一種用法講,在和3D有不同的地方,我們再提出來。

1、加載文件頭

            //Load the file header

            BITMAPFILEHEADER header;

            memset(&header, 0, sizeof(header));

            inf.read((char*)&header, sizeof(header));

            if(header.bfType != 0x4D42)

                        return false;

            這個(gè)很簡單,沒有什么好說的。

            2、加載位圖信息頭

            //Load the image information header

            BITMAPINFOHEADER infoheader;

            memset(&infoheader, 0, sizeof(infoheader));

            inf.read((char*)&infoheader, sizeof(infoheader));

            m_iImageWidth = infoheader.biWidth;

            m_iImageHeight = infoheader.biHeight;

            m_iBitsPerPixel = infoheader.biBitCount;

            這里我們得到了3各重要的圖形屬性:寬,高,以及每個(gè)像素顏色所占用的位數(shù)。

3、行對齊

由于Windows在進(jìn)行行掃描的時(shí)候最小的單位為4個(gè)字節(jié),所以當(dāng)

圖片寬 X 每個(gè)像素的字節(jié)數(shù) != 4的整數(shù)倍

時(shí)要在每行的后面補(bǔ)上缺少的字節(jié),以0填充(一般來說當(dāng)圖像寬度為2的冪時(shí)不需要對齊)。位圖文件里的數(shù)據(jù)在寫入的時(shí)候已經(jīng)進(jìn)行了行對齊,也就是說加載的時(shí)候不需要再做行對齊。但是這樣一來圖片數(shù)據(jù)的長度就不是:寬 X X 每個(gè)像素的字節(jié)數(shù) 了,我們需要通過下面的方法計(jì)算正確的數(shù)據(jù)長度:

//Calculate the image data size

int iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2;

m_iImageDataSize = iLineByteCnt * m_iImageHeight;

4、加載圖片數(shù)據(jù)

對于24位和32位的位圖文件,位圖數(shù)據(jù)的偏移量為sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),也就是說現(xiàn)在我們可以直接讀取圖像數(shù)據(jù)了。

            if(m_pImageData) delete []m_pImageData;

            m_pImageData = new unsigned char[m_iImageDataSize];

            inf.read((char*)m_pImageData, m_iImageDataSize);

如果你足夠細(xì)心,就會發(fā)現(xiàn)內(nèi)存m_pImageData里的數(shù)據(jù)的確是BGR格式,可以用個(gè)純藍(lán)色或者是純紅色的圖片測試一下。

5、繪制

好了,數(shù)據(jù)和屬性我們都有了,現(xiàn)在就可以拿來隨便用了,就和吃饅頭一樣,愛粘白糖粘白糖,愛粘紅糖粘紅糖。下面是我的GDI繪制代碼,僅作參考。

void CImage::DrawImage(HDC hdc, int iLeft, int iTop, int iWidth, int iHeight)

{

            if(!hdc || m_pImageData == NULL)

                        return;

            BITMAPINFO bmi;

            memset(&bmi, 0, sizeof(bmi));

            bmi.bmiHeader.biSize = sizeof(BITMAPINFO);

            bmi.bmiHeader.biWidth = m_iImageWidth;

            bmi.bmiHeader.biHeight = m_iImageHeight;

            bmi.bmiHeader.biPlanes = 1;

            bmi.bmiHeader.biBitCount = m_iBitsPerPixel;

            bmi.bmiHeader.biCompression = BI_RGB;

            bmi.bmiHeader.biSizeImage = m_iImageDataSize;

            StretchDIBits(hdc, iLeft, iTop, iWidth, iHeight,

                                                0, 0, m_iImageWidth, m_iImageHeight,

                                                m_pImageData, &bmi, DIB_RGB_COLORS, SRCCOPY);

}

6、3D(OpenGL)的不同之處

如果你是想用剛才我們得到的數(shù)據(jù)生成紋理對象,那么你還要請出下面的問題。

首先,用來生成紋理的數(shù)據(jù)不需要對齊,也就是說不能在每行的后面加上對齊的字節(jié)。當(dāng)然在OpenGL里要求紋理圖片的尺寸為2的冪,所以這個(gè)問題實(shí)際上不存在;

其次,我們得到的圖形數(shù)據(jù)格式是BGR(BGRA),所以在生成紋理的時(shí)候,需指定格式為GL_BGR_EXT(GL_BGRA_EXT);否則需要做BGR->RGB(BGRA->RGBA)的轉(zhuǎn)化

posted on 2008-09-03 18:24 大海 閱讀(1193) 評論(0)  編輯 收藏 引用 所屬分類: 圖像

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产精选| 亚洲精品免费在线观看| 99精品视频免费全部在线| 久久成年人视频| 亚洲剧情一区二区| 欧美高清在线视频观看不卡| 亚洲第一精品在线| 麻豆成人在线观看| 久久精品国产免费看久久精品| 国产精品一国产精品k频道56| 亚洲神马久久| 在线综合亚洲欧美在线视频| 欧美三级视频在线播放| 亚洲欧美变态国产另类| 亚洲自拍高清| 国产亚洲成精品久久| 久久激情视频| 蜜臀av一级做a爰片久久 | 猛干欧美女孩| 久久九九国产精品| 久久久久一区二区三区| 亚洲国产免费| 亚洲精品国久久99热| 亚洲国产精品成人综合色在线婷婷| 亚洲国产日韩精品| 亚洲国产一区在线| 蜜桃av久久久亚洲精品| 欧美va天堂| 欧美亚洲成人精品| 另类av导航| 在线播放日韩欧美| 99re亚洲国产精品| 国产一区二区三区网站| 亚洲精品国产精品国自产观看浪潮| 最新国产精品拍自在线播放| 中日韩高清电影网| 亚洲自拍都市欧美小说| 久久久久五月天| 欧美黑人一区二区三区| 国产精品一区二区久久| 午夜精品国产| 在线视频欧美精品| 久久久久亚洲综合| 欧美肥婆在线| 国产一区二区日韩| 久久精品夜色噜噜亚洲a∨| 亚洲一区二区毛片| 欧美国产成人在线| 一级日韩一区在线观看| 亚洲三级网站| 久久男女视频| 久久精品国产视频| 亚洲韩日在线| 欧美涩涩网站| 久久精品国产一区二区三区| 欧美大片在线看免费观看| 99在线观看免费视频精品观看| 久久久久天天天天| 亚洲理伦电影| 久久久久国产精品人| 91久久精品国产91久久| 国产精品女人毛片| 一本久久a久久精品亚洲| 久久精品成人一区二区三区| 亚洲高清视频的网址| 欧美偷拍另类| 久久久国产一区二区三区| 亚洲美女一区| 久久久国产精品亚洲一区| 亚洲六月丁香色婷婷综合久久| 浪潮色综合久久天堂| 免费久久久一本精品久久区| 国产一区二区在线观看免费播放| 亚洲精品视频在线播放| 久久成人精品无人区| 日韩视频免费观看| 黄色另类av| 久久亚洲高清| 亚洲一级在线观看| 久久福利毛片| 亚洲午夜精品一区二区三区他趣| 国产一区二区欧美| 国产精品久久久一本精品| 欧美成人中文字幕在线| 91久久精品日日躁夜夜躁国产| 日韩视频精品| 亚洲电影视频在线| 国产午夜精品在线观看| 欧美吻胸吃奶大尺度电影| 欧美成人免费在线观看| 久久久999| 亚洲欧美综合国产精品一区| 日韩一级片网址| 91久久精品日日躁夜夜躁欧美 | 欧美1区视频| 欧美在线看片| 亚洲欧美日韩在线综合| 99re在线精品| 国产毛片一区| 国产精品久久久久久久9999| 欧美一级播放| 亚洲福利视频专区| 亚洲欧美清纯在线制服| 日韩亚洲欧美精品| 日韩视频永久免费| 亚洲欧洲日韩女同| 亚洲国产精品久久久久秋霞影院| 国产在线乱码一区二区三区| 国产亚洲精品久久久久动| 国产精品久久福利| 欧美视频成人| 国产精品久久精品日日| 欧美性事免费在线观看| 欧美日韩精品久久久| 亚洲摸下面视频| 亚洲欧美国产日韩天堂区| 亚洲男人的天堂在线观看| 亚洲专区一区| 亚洲欧美综合精品久久成人| 午夜精品福利一区二区蜜股av| 亚洲综合色婷婷| 欧美在线不卡视频| 亚洲免费观看高清完整版在线观看熊| 亚洲高清资源综合久久精品| 亚洲韩国精品一区| aa级大片欧美| 亚洲一区二区黄色| 亚洲国产成人不卡| 99国产精品99久久久久久| 国产精品99久久久久久久久 | 久久精品一区二区三区四区| 久久久久看片| 欧美激情一区二区三区全黄| 久久久精品动漫| 男同欧美伦乱| 久久久之久亚州精品露出| 欧美sm视频| 国产精品高清网站| 黄色成人av| 一本色道久久综合亚洲91| 亚洲免费一级电影| 久久一区视频| 久久经典综合| 欧美激情四色 | 欧美日本在线观看| 老司机免费视频一区二区三区| 欧美激情在线观看| 国产精品亚洲一区| 国产精品视频1区| 一区二区三区在线观看视频| 国产在线精品成人一区二区三区| 亚洲欧洲一区二区天堂久久| 亚洲一区二区三区精品在线观看| 久久一区欧美| 一区二区福利| 女人天堂亚洲aⅴ在线观看| 国产精品美女久久久免费 | 国产一区二区三区四区五区美女 | 午夜精品久久久| 欧美成人精品在线观看| 国产视频不卡| 亚洲一区二区三区在线看 | 久久免费视频在线| 国产精品入口日韩视频大尺度| 亚洲高清av在线| 欧美在线欧美在线| 夜夜狂射影院欧美极品| 久热国产精品| 狠久久av成人天堂| 欧美一级理论性理论a| 先锋影音久久| 亚洲精品在线一区二区| 久久久无码精品亚洲日韩按摩| 国产精品人人爽人人做我的可爱| 亚洲区免费影片| 免费观看成人www动漫视频| 亚洲综合二区| 欧美性猛片xxxx免费看久爱| 亚洲精品乱码久久久久久按摩观| 久久蜜桃香蕉精品一区二区三区| 毛片基地黄久久久久久天堂| 亚洲已满18点击进入久久 | 久久综合狠狠| 黑人操亚洲美女惩罚| 久久精品免费播放| 亚洲自拍另类| 国产精品一区二区三区久久| 亚洲一区制服诱惑| 一本大道久久a久久精二百| 欧美精品99| 99re热这里只有精品免费视频| 亚洲福利视频三区| 欧美国产日本| 日韩写真在线| 亚洲精品免费一二三区| 欧美日韩国产亚洲一区| 亚洲深夜福利在线| 亚洲一二三四区| 国产农村妇女精品一二区| 亚洲精品男同|