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

c++初學者

專注技術開發

(轉) bmp圖分析

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

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

位圖文件主要分為如下3個部分:

塊名稱

對應Windows結構體定義

大小(Byte

文件信息頭

BITMAPFILEHEADER

14

位圖信息頭

BITMAPINFOHEADER

40

RGB顏色陣列

BYTE*

由圖像長寬尺寸決定

1、   文件信息頭BITMAPFILEHEADER

結構體定義如下:

typedef struct tagBITMAPFILEHEADER { /* bmfh */

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

} BITMAPFILEHEADER;

其中:

bfType

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

bfSize

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

bfReserved1

保留,必須設置為0

bfReserved2

保留,必須設置為0

bfOffBits

說明從文件頭開始到實際的圖象數據之間的字節的偏移量。這個參數是非常有用的,因為位圖信息頭和調色板的長度會根據不同情況而變化,所以你可以用這個偏移值迅速的從文件中讀取到位數據。


2、位圖信息頭BITMAPINFOHEADER

結構體定義如下:

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結構所需要的字數。

biWidth

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

biHeight

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

biPlanes

為目標設備說明位面數,其值將總是被設為1。

biBitCount

說明比特數/象素,其值為1、4816、24、或32。但是由于我們平時用到的圖像絕大部分是24位和32位的,所以我們討論這兩類圖像。

biCompression

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

biSizeImage

說明圖象的大小,以字節為單位。當用BI_RGB格式時,可設置為0

biXPelsPerMeter

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

biYPelsPerMeter

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

biClrUsed

說明位圖實際使用的彩色表中的顏色索引數(設為0的話,則說明使用所有調色板項)。

biClrImportant

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

3、RGB顏色陣列

有關RGB三色空間我想大家都很熟悉,這里我想說的是在Windows下,RGB顏色陣列存儲的格式其實BGR。也就是說,對于24位的RGB位圖像素數據格式是:

藍色B

綠色G

紅色R

對于32位的RGB位圖像素數據格式是:

藍色B

綠色G

紅色R

透明通道A

透明通道也稱Alpha通道,該值是該像素點的透明屬性,取值在0(全透明)到255(不透明)之間。對于24位的圖像來說,因為沒有Alpha通道,故整個圖像都不透明。

二、搞清了文件格式,下一步我們要實現加載。

            加載文件的目的是要得到圖片屬性,以及RGB數據,然后可以將其繪制在DC(GDI),或是生成紋理對象(3D:OpenGL/Direct3D)。這兩種用途在數據處理上有點區別,我們主要按前一種用法講,在和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;

            這個很簡單,沒有什么好說的。

            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各重要的圖形屬性:寬,高,以及每個像素顏色所占用的位數。

3、行對齊

由于Windows在進行行掃描的時候最小的單位為4個字節,所以當

圖片寬 X 每個像素的字節數 != 4的整數倍

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

//Calculate the image data size

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

m_iImageDataSize = iLineByteCnt * m_iImageHeight;

4、加載圖片數據

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

            if(m_pImageData) delete []m_pImageData;

            m_pImageData = new unsigned char[m_iImageDataSize];

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

如果你足夠細心,就會發現內存m_pImageData里的數據的確是BGR格式,可以用個純藍色或者是純紅色的圖片測試一下。

5、繪制

好了,數據和屬性我們都有了,現在就可以拿來隨便用了,就和吃饅頭一樣,愛粘白糖粘白糖,愛粘紅糖粘紅糖。下面是我的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)的不同之處

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

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

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

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>
            在线日韩中文字幕| 亚洲视频图片小说| 女女同性精品视频| 久久综合九色欧美综合狠狠| 伊人夜夜躁av伊人久久| 欧美电影在线播放| 欧美激情va永久在线播放| 亚洲精品九九| 亚洲三级影院| 欧美色另类天堂2015| 亚洲欧美在线视频观看| 欧美一区二区女人| 激情综合色综合久久综合| 欧美福利一区二区| 欧美日韩影院| 久久亚洲欧洲| 美女精品在线| 亚洲欧美色婷婷| 久久久欧美一区二区| 99在线精品视频| 欧美亚洲在线| 亚洲精品一区二区网址| 中文久久精品| 尤物九九久久国产精品的特点 | 国产欧美一级| 欧美日韩国产成人| 亚洲欧美日韩精品综合在线观看| 欧美与黑人午夜性猛交久久久| 1000部精品久久久久久久久| 亚洲美女在线一区| 国产精品外国| 亚洲黄色毛片| 国产一区二区日韩精品| 亚洲黄色影院| 国产日韩欧美亚洲一区| 最新成人av网站| 国产在线观看91精品一区| 亚洲精华国产欧美| 国产专区欧美专区| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲视频一区二区| 久久久精彩视频| 亚洲自拍偷拍一区| 欧美刺激午夜性久久久久久久| 先锋影音国产精品| 欧美日本国产在线| 欧美顶级艳妇交换群宴| 国产一区视频在线看| 妖精成人www高清在线观看| 亚洲国产成人午夜在线一区| 亚洲午夜精品网| 一区二区欧美在线| 欧美不卡三区| 欧美1区3d| 国外成人网址| 欧美一区二区三区男人的天堂| 亚洲天堂激情| 欧美乱在线观看| 亚洲黄色精品| 亚洲理伦在线| 欧美极品一区二区三区| 欧美激情在线狂野欧美精品| 韩国一区二区三区在线观看| 午夜精品久久99蜜桃的功能介绍| 亚洲欧美成人精品| 国产精品久在线观看| 一本色道久久综合| 亚洲制服av| 国产精品国产精品| 亚洲色无码播放| 亚洲欧美偷拍卡通变态| 国产精品乱子乱xxxx| 一区二区高清视频在线观看| 中文国产亚洲喷潮| 欧美午夜视频在线| 亚洲在线电影| 久久久久国产一区二区三区四区| 国产无一区二区| 欧美影院视频| 欧美顶级大胆免费视频| 亚洲美女福利视频网站| 欧美日韩一区在线观看| 亚洲一区二区在线免费观看视频| 午夜精品一区二区三区四区| 国产精品一区二区久久国产| 亚洲一区免费在线观看| 久久精品日韩一区二区三区| 黑人操亚洲美女惩罚| 久久久久国色av免费看影院 | 久久爱另类一区二区小说| 国产老肥熟一区二区三区| 欧美中文字幕久久| 欧美激情亚洲国产| 亚洲网站在线看| 国产人妖伪娘一区91| 玖玖视频精品| 国产精品99久久99久久久二8| 久久国产精品网站| 91久久精品www人人做人人爽| 欧美日韩亚洲不卡| 午夜国产精品视频| 欧美sm视频| 亚洲与欧洲av电影| 雨宫琴音一区二区在线| 欧美日韩在线看| 久久精品国产999大香线蕉| 最新国产成人av网站网址麻豆| 亚洲欧美日韩精品久久亚洲区| 韩国三级电影一区二区| 欧美日韩日本视频| 欧美在线中文字幕| 日韩一级在线观看| 免费黄网站欧美| 午夜性色一区二区三区免费视频| 亚洲二区精品| 国产视频一区三区| 欧美视频日韩视频在线观看| 久久精品国产久精国产思思| 亚洲最新在线视频| 欧美成人免费在线视频| 久久er99精品| 亚洲欧美日本在线| 亚洲精品美女免费| 激情av一区| 国产欧美一区二区三区在线老狼| 欧美激情精品久久久久久| 久久九九免费视频| 亚洲免费视频网站| 一区二区三区毛片| 亚洲精品久久| 亚洲国产日韩在线一区模特| 久久视频精品在线| 欧美一区二区成人| 亚洲欧美日产图| 亚洲一区中文| 亚洲香蕉伊综合在人在线视看| 91久久国产综合久久蜜月精品| 国产最新精品精品你懂的| 国产精品中文字幕在线观看| 欧美系列精品| 欧美视频中文字幕在线| 欧美日韩视频在线观看一区二区三区| 老司机精品视频网站| 久久久噜噜噜久久| 久久久国产亚洲精品| 久久久青草婷婷精品综合日韩| 午夜亚洲影视| 欧美呦呦网站| 久久久蜜桃精品| 久久婷婷久久一区二区三区| 久久中文字幕导航| 欧美va亚洲va国产综合| 欧美电影打屁股sp| 欧美精品一区二区视频| 欧美日韩视频在线一区二区 | 欧美日韩中文精品| 欧美日韩精品欧美日韩精品| 欧美另类亚洲| 国产精品久久久久影院亚瑟| 国产精品夜夜夜一区二区三区尤| 国产精品一区视频网站| 国产日韩欧美亚洲一区| 狠狠色丁香婷婷综合影院| 永久域名在线精品| 亚洲激情综合| 亚洲永久免费精品| 久久久久久国产精品mv| 欧美77777| 日韩亚洲一区二区| 亚洲在线观看| 久热精品视频在线观看一区| 欧美精品一区二区久久婷婷| 欧美性久久久| 国模大胆一区二区三区| 亚洲片国产一区一级在线观看| 99精品久久久| 欧美在线观看视频一区二区三区| 久久夜色精品国产欧美乱| 亚洲电影毛片| 亚洲欧美一区在线| 老鸭窝亚洲一区二区三区| 欧美日韩在线精品| 黄色亚洲网站| 亚洲午夜精品| 久久综合中文字幕| 日韩一区二区精品葵司在线| 久久激情一区| 欧美日韩一区在线| 在线欧美电影| 午夜精品久久久久久久99樱桃 | 欧美一区二区三区电影在线观看| 麻豆成人在线播放| 国产精品专区一| 亚洲精品亚洲人成人网| 久久精品二区三区| 亚洲免费观看高清完整版在线观看熊 | 国产欧美一区二区色老头| 亚洲精品一区中文| 久久久久国产免费免费| 亚洲作爱视频|