久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

BMP圖像文件格式

 xihayouyi 2011-03-10

BMP圖像文件格式 
對(duì)于現(xiàn)存的所有的圖像文件格式,,我們?cè)谶@里主要介紹BMP圖像文件格式,并且文件里的圖像數(shù)據(jù)是未壓縮的,,因?yàn)閳D像的數(shù)字化處理主要是對(duì)圖像中的各個(gè)像素進(jìn)行相應(yīng)的處理,,而未壓縮的BMP圖像中的像素?cái)?shù)值正好與實(shí)際要處理的數(shù)字圖像相對(duì)應(yīng),這種格式的文件最合適我們對(duì)之進(jìn)行數(shù)字化處理,。請(qǐng)讀者記住,,壓縮過(guò)的圖像是無(wú)法直接進(jìn)行數(shù)字化處理的,如JPEG、GIF等格式的文件,,此時(shí)首先要對(duì)圖像文件解壓縮,,這就要涉及到一些比較復(fù)雜的壓縮算法。后續(xù)章節(jié)中我們將針對(duì)特殊的文件格式如何轉(zhuǎn)換為BMP格式的文件問(wèn)題作專門(mén)的論述,,經(jīng)過(guò)轉(zhuǎn)換,,我們就可以利用得到的未壓縮的BMP文件格式進(jìn)行后續(xù)處理。對(duì)于JPEG,、GIF等格式,,由于涉及到壓縮算法,這要求讀者掌握一定的信息論方面的知識(shí),,如果展開(kāi)的話,,可以寫(xiě)一本書(shū),限于篇幅原因,,我們只作一般性的講解,,有興趣的朋友可以參考相關(guān)書(shū)籍資料。

一,、BMP文件結(jié)構(gòu)

1. BMP文件組成

BMP文件由文件頭,、位圖信息頭、顏色信息和圖形數(shù)據(jù)四部分組成,。文件頭主要包含文件的大小,、文件類型、圖像數(shù)據(jù)偏離文件頭的長(zhǎng)度等信息,;位圖信息頭包含圖象的尺寸信息,、圖像用幾個(gè)比特?cái)?shù)值來(lái)表示一個(gè)像素、圖像是否壓縮,、圖像所用的顏色數(shù)等信息,。顏色信息包含圖像所用到的顏色表,,顯示圖像時(shí)需用到這個(gè)顏色表來(lái)生成調(diào)色板,,但如果圖像為真彩色,既圖像的每個(gè)像素用24個(gè)比特來(lái)表示,,文件中就沒(méi)有這一塊信息,,也就不需要操作調(diào)色板。文件中的數(shù)據(jù)塊表示圖像的相應(yīng)的像素值,,需要注意的是:圖像的像素值在文件中的存放順序?yàn)閺淖蟮接?,從下到上,也就是說(shuō),,在BMP文件中首先存放的是圖像的最后一行像素,,最后才存儲(chǔ)圖像的第一行像素,但對(duì)與同一行的像素,,則是按照先左邊后右邊的的順序存儲(chǔ)的,;另外一個(gè)需要讀者朋友關(guān)注的細(xì)節(jié)是:文件存儲(chǔ)圖像的每一行像素值時(shí),,如果存儲(chǔ)該行像素值所占的字節(jié)數(shù)為4的倍數(shù),則正常存儲(chǔ),,否則,,需要在后端補(bǔ)0,湊足4的倍數(shù),。

2. BMP文件頭

BMP文件頭數(shù)據(jù)結(jié)構(gòu)含有BMP文件的類型,、文件大小和位圖起始位置等信息。其結(jié)構(gòu)定義如下: typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位圖文件的類型,,必須為“BM”
DWORD bfSize; // 位圖文件的大小,,以字節(jié)為單位
WORD bfReserved1; // 位圖文件保留字,必須為0
WORD bfReserved2; // 位圖文件保留字,,必須為0
DWORD bfOffBits; // 位圖數(shù)據(jù)的起始位置,,以相對(duì)于位圖文件頭的偏移量表示,以字節(jié)為單位
} BITMAPFILEHEADER,;該結(jié)構(gòu)占據(jù)14個(gè)字節(jié),。

3. 位圖信息頭

BMP位圖信息頭數(shù)據(jù)用于說(shuō)明位圖的尺寸等信息。其結(jié)構(gòu)如下:

typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本結(jié)構(gòu)所占用字節(jié)數(shù)
LONG biWidth; // 位圖的寬度,,以像素為單位
LONG biHeight; // 位圖的高度,,以像素為單位
WORD biPlanes; // 目標(biāo)設(shè)備的平面數(shù)不清,必須為1
WORD biBitCount// 每個(gè)像素所需的位數(shù),,必須是1(雙色), 4(16色),,8(256色)或24(真彩色)之一
DWORD biCompression; // 位圖壓縮類型,必須是 0(不壓縮),1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
DWORD biSizeImage; // 位圖的大小,,以字節(jié)為單位
LONG biXPelsPerMeter; // 位圖水平分辨率,,每米像素?cái)?shù)
LONG biYPelsPerMeter; // 位圖垂直分辨率,每米像素?cái)?shù)
DWORD biClrUsed;// 位圖實(shí)際使用的顏色表中的顏色數(shù)
DWORD biClrImportant;// 位圖顯示過(guò)程中重要的顏色數(shù)
} BITMAPINFOHEADER,;該結(jié)構(gòu)占據(jù)40個(gè)字節(jié),。


注意:對(duì)于BMP文件格式,在處理單色圖像和真彩色圖像的時(shí)候,,無(wú)論圖象數(shù)據(jù)多么龐大,,都不對(duì)圖象數(shù)據(jù)進(jìn)行任何壓縮處理,一般情況下,,如果位圖采用壓縮格式,,那么16色圖像采用RLE4壓縮算法,256色圖像采用RLE8壓縮算法,。

4. 顏色表

顏色表用于說(shuō)明位圖中的顏色,,它有若干個(gè)表項(xiàng),每一個(gè)表項(xiàng)是一個(gè)RGBQUAD類型的結(jié)構(gòu),定義一種顏色,。RGBQUAD結(jié)構(gòu)的定義如下:

typedef struct tagRGBQUAD {
BYTErgbBlue;// 藍(lán)色的亮度(值范圍為0-255)
BYTErgbGreen; // 綠色的亮度(值范圍為0-255)
BYTErgbRed; // 紅色的亮度(值范圍為0-255)
BYTErgbReserved;// 保留,,必須為0
} RGBQUAD;
 

顏色表中RGBQUAD結(jié)構(gòu)數(shù)據(jù)的個(gè)數(shù)由BITMAPINFOHEADER 中的biBitCount項(xiàng)來(lái)確定,當(dāng)biBitCount=1,4,8時(shí),,分別有2,16,256個(gè)顏色表項(xiàng),,當(dāng)biBitCount=24時(shí),圖像為真彩色,,圖像中每個(gè)像素的顏色用三個(gè)字節(jié)表示,,分別對(duì)應(yīng)R、G,、B值,,圖像文件沒(méi)有顏色表項(xiàng)。位圖信息頭和顏色表組成位圖信息,,BITMAPINFO結(jié)構(gòu)定義如下:

typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位圖信息頭
RGBQUAD bmiColors[1]; // 顏色表
} BITMAPINFO;
 

注意:RGBQUAD數(shù)據(jù)結(jié)構(gòu)中,,增加了一個(gè)保留字段rgbReserved,它不代表任何顏色,,必須取固定的值為“0”,,同時(shí),RGBQUAD結(jié)構(gòu)中定義的顏色值中,,紅色,、綠色和藍(lán)色的排列順序與一般真彩色圖像文件的顏色數(shù)據(jù)排列順序恰好相反,既:若某個(gè)位圖中的一個(gè)像素點(diǎn)的顏色的描述為“00,,00,,ff,00”,,則表示該點(diǎn)為紅色,,而不是藍(lán)色。

5. 位圖數(shù)據(jù)

位圖數(shù)據(jù)記錄了位圖的每一個(gè)像素值或該對(duì)應(yīng)像素的顏色表的索引值,,圖像記錄順序是在掃描行內(nèi)是從左到右,掃描行之間是從下到上,。這種格式我們又稱為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)/8;// 一個(gè)掃描行所占的字節(jié)數(shù)
 

位圖數(shù)據(jù)的大小按下式計(jì)算(不壓縮情況下):

DataSize= DataSizePerLine* biHeight,。
 

上述是BMP文件格式的說(shuō)明,,搞清楚了以上的結(jié)構(gòu),就可以正確的操作圖像文件,,對(duì)它進(jìn)行讀或?qū)懖僮髁恕?/font>

GIF圖像文件格式

GIF圖象格式的全稱為Graphics Interchange Format,,從這個(gè)名字可以看出,這種圖像格式主要是為了通過(guò)網(wǎng)絡(luò)傳輸圖像而設(shè)計(jì)的,。GIF文件不支持24位真彩色圖像,,最多只能存儲(chǔ)256色的圖像或灰度圖像;GIF格式文件也無(wú)法存儲(chǔ)CMY和HIS模型的圖像數(shù)據(jù),;另外,,GIF圖像文件的各種數(shù)據(jù)區(qū)域一般沒(méi)有固定的數(shù)據(jù)長(zhǎng)度和存儲(chǔ)順序,所以為了方便程序?qū)ふ覕?shù)據(jù)區(qū),,將數(shù)據(jù)區(qū)中的第一個(gè)字節(jié)作為標(biāo)志符,;最后需要讀者注意的是GIF文件存儲(chǔ)圖像數(shù)據(jù)是有二種排列順序:順序排列或交叉排列。交叉排列的方式適合網(wǎng)絡(luò)傳輸,,這樣一來(lái)允許用戶在不完全掌握?qǐng)D像數(shù)據(jù)之前,,獲取當(dāng)前圖像的輪廓數(shù)據(jù)。

GIF文件格式分為87和89兩個(gè)版本,,對(duì)于87這個(gè)版本,,該文件主要是有五個(gè)部分組成,它,,們是按順序出現(xiàn)的:文件頭塊,、邏輯屏幕描述塊,、可選擇的調(diào)色板塊、圖像數(shù)據(jù)塊,、最后是標(biāo)志文件結(jié)束的尾塊,,該塊總是取固定的值3BH。其中第一和第二兩個(gè)塊用GIF圖像文件頭結(jié)構(gòu)描述:

GIFHEADER:{
DB Signature; //該字段占六個(gè)字節(jié),,為了用于指明圖像為GIF格式,,前三個(gè)字符必須為“GIF”,后三字符用于指定是哪個(gè)版本,,87或89,。
DW ScreenWidth;//
DW ScreenDepth;//占兩個(gè)字節(jié),以像素為單位表示圖像的寬,、高
DB GlobalFlagByte;//該字節(jié)的各個(gè)位用于調(diào)色版的描述
DB BackGroundColor;//代表圖象的背景顏色的索引
DB AspectRatio;圖像的長(zhǎng)寬比
}
 

GIF格式中的調(diào)色板有通用調(diào)色板和局部調(diào)色板之分,,因?yàn)镚IF格式允許一個(gè)文件中存儲(chǔ)多個(gè)圖像,因此有這兩種調(diào)色板,,其中通用調(diào)色板適于文件中的所有圖像,,而局部調(diào)色板只適用于某一個(gè)圖像。格式中的數(shù)據(jù)區(qū)域一般分為四個(gè)部分,,圖像數(shù)據(jù)識(shí)別區(qū)域,,局部調(diào)色板數(shù)據(jù),采用壓縮算法得到的圖象數(shù)據(jù)區(qū)域和結(jié)束標(biāo)志區(qū)域,。

在GIF89版本中,,它包含七個(gè)部分,分別是文件頭,、通用調(diào)色板數(shù)據(jù),、圖像數(shù)據(jù)區(qū)和四個(gè)補(bǔ)充數(shù)據(jù)區(qū),它們主要是用于提示程序如何處理圖像的,。

下面分別介紹各種RGB格式,。
¨ RGB1、RGB4,、RGB8都是調(diào)色板類型的RGB格式,,在描述這些媒體類型的格式細(xì)節(jié)時(shí),通常會(huì)在BITMAPINFOHEADER數(shù)據(jù)結(jié)構(gòu)后面跟著一個(gè)調(diào)色板(定義一系列顏色),。它們的圖像數(shù)據(jù)并不是真正的顏色值,,而是當(dāng)前像素顏色值在調(diào)色板中的索引。以RGB1(2色位圖)為例,,比如它的調(diào)色板中定義的兩種顏色值依次為0x000000(黑色)和0xFFFFFF(白色),,那么圖像數(shù)據(jù)001101010111…(每個(gè)像素用1位表示)表示對(duì)應(yīng)各像素的顏色為:黑黑白白黑白黑白黑白白白…。
¨ RGB565使用16位表示一個(gè)像素,,這16位中的5位用于R,,6位用于G,5位用于B,。程序中通常使用一個(gè)字(WORD,,一個(gè)字等于兩個(gè)字節(jié))來(lái)操作一個(gè)像素。當(dāng)讀出一個(gè)像素后,,這個(gè)字的各個(gè)位意義如下:
     高字節(jié)              低字節(jié)
R R R R R G G G     G G G B B B B B
可以組合使用屏蔽字和移位操作來(lái)得到RGB各分量的值:
#define RGB565_MASK_RED    0xF800
#define RGB565_MASK_GREEN  0x07E0
#define RGB565_MASK_BLUE   0x001F
R = (wPixel & RGB565_MASK_RED) >> 11;   // 取值范圍0-31
G = (wPixel & RGB565_MASK_GREEN) >> 5;  // 取值范圍0-63
B =  wPixel & RGB565_MASK_BLUE;         // 取值范圍0-31
¨ RGB555是另一種16位的RGB格式,,RGB分量都用5位表示(剩下的1位不用)。使用一個(gè)字讀出一個(gè)像素后,,這個(gè)字的各個(gè)位意義如下:
     高字節(jié)             低字節(jié)
X R R R R G G       G G G B B B B B       (X表示不用,,可以忽略)
可以組合使用屏蔽字和移位操作來(lái)得到RGB各分量的值:
#define RGB555_MASK_RED    0x7C00
#define RGB555_MASK_GREEN  0x03E0
#define RGB555_MASK_BLUE   0x001F
R = (wPixel & RGB555_MASK_RED) >> 10;   // 取值范圍0-31
G = (wPixel & RGB555_MASK_GREEN) >> 5;  // 取值范圍0-31
B =  wPixel & RGB555_MASK_BLUE;         // 取值范圍0-31
¨ RGB24使用24位來(lái)表示一個(gè)像素,RGB分量都用8位表示,,取值范圍為0-255,。注意在內(nèi)存中RGB各分量的排列順序?yàn)椋築GR BGR BGR…。通??梢允褂肦GBTRIPLE數(shù)據(jù)結(jié)構(gòu)來(lái)操作一個(gè)像素,,它的定義為:
typedef struct tagRGBTRIPLE {
  BYTE rgbtBlue;    // 藍(lán)色分量
  BYTE rgbtGreen;   // 綠色分量
  BYTE rgbtRed;     // 紅色分量
} RGBTRIPLE;
¨ RGB32使用32位來(lái)表示一個(gè)像素,RGB分量各用去8位,,剩下的8位用作Alpha通道或者不用,。(ARGB32就是帶Alpha通道的RGB32。)注意在內(nèi)存中RGB各分量的排列順序?yàn)椋築GRA BGRA BGRA…,。通??梢允褂肦GBQUAD數(shù)據(jù)結(jié)構(gòu)來(lái)操作一個(gè)像素,它的定義為:
typedef struct tagRGBQUAD {
  BYTE    rgbBlue;      // 藍(lán)色分量
  BYTE    rgbGreen;     // 綠色分量
  BYTE    rgbRed;       // 紅色分量
  BYTE    rgbReserved;  // 保留字節(jié)(用作Alpha通道或忽略)
} RGBQUAD;

 

本文來(lái)自CSDN博客,,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xoyojank/archive/2007/03/31/1547273.aspx

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多