BMP
BMP取自點陣圖Bitmap的縮寫,嘛叫做DIB(佮裝置無關係的點陣圖), 是一種獨立佇咧監視器的點陣圖數位影像檔案格式。定定看過微軟視窗佮 OS / 二作業系統,Windows GDI API 內部使用的 DIB 資料結構佮 BMP 檔案格式差不多仝款。
圖像通常儲存的色水等等有二(一位)、 十六(四位元)、 兩百五十六(八位元)、 六嬸五千五百三十六(十六位元)佮一千六百七十萬(二十四位元)種色水(其中位是表示每一點所用的資料位)。 八位元圖像會當是索引彩色圖像外,嘛會當是灰階圖像。表示透明的 alpha 通道也會當儉佇一个類似灰階圖像的獨立檔案內底。帶有整合的 alpha 通道的三十二位元版本已經隨著 Windows XP 出現,伊佇咧 Windows 系統登入介面和系統主題內底攏有使用。
儲存演算法
BMP 檔案通常是袂壓縮的,所以𪜶通常攏比仝一幅圖像的壓縮圖檔格式愛大足濟的。比如講,一个八百 × 六百的二十四位元差不多占一分四 MB 空間。所以𪜶通常是無適合佇網路或者是其他低速或者是有容量限制的媒介上進行傳輸。
根據色水的深度無仝,圖像上的一个像素會當用一个抑是講濟个位元組表示講,伊由n / 八所確定講(n 是位深度,一个元組包含八个資料位)。 圖片瀏覽器等等基於是位元組的 ASCII 值計算像素的色水,然後對調色盤內底讀出相應的值。閣較詳細的資訊請參閱下跤有關於點陣圖檔案的部份。
n 位二 n 種色水的包含調色盤的點陣圖就近似位元組數會當用下跤的公式來計算:
BMP 檔案大細$ \ approx 五十四 + 四 \ cdot 二 ^ { n } + { \ frac { { \ rm { width } } \ cdot { \ rm { height } } \ cdot n } { 八 } } $,其中懸度(height)猶閣有闊度(width)攏以像素為單位。
需要注意的是頂懸公式中的五十四是點陣圖檔案的檔案頭,$ 四 \ cdot 二 ^ { n } $ 是彩色調色盤的大細。 若點陣圖檔案無包括調色盤,如果二十四位元,三十二位元點陣圖,是點陣圖的近親像位元組數會當用下跤的公式來計算:
BMP 檔案大細$ \ approx 五十四 + { \ frac { { \ rm { width } } \ cdot { \ rm { height } } \ cdot n } { 八 } } $,其中懸度(height)猶閣有闊度(width)攏以像素為單位。
另外需要注意的是這是一个近似值,對於 n 位的點陣圖像來講,就算講伊可能有上濟 $ 二 ^ { n } $ 種色水,一个特定的圖像可能並袂當用遮的所有的色水。因為彩色調色盤干焦定義矣圖像所用的色,所以實際的彩色調色盤共小於 $ 四 \ cdot 二 ^ { n } $。
若欲知影遮的值是按怎得著的,來請參考後壁檔案格式的部份。
因為儲存演算法本身決定的因素,根據幾个圖像參數的無仝計算出的大細佮實際的檔案大細會有一寡細細的差別。
檔案格式
點陣圖檔由若干大細固定(檔案頭)佮大細可變的結構體按呢一定的順序構成。因為這个檔案提供應該經濟演進,遮的結構體的版本嘛足濟的。
點陣圖檔案由以下結構體依次構成:
下跤的部份就會詳細來描述點陣圖檔案當中儲存的資料。需要注意的是這是標準點陣圖的檔案格式,其他一寡點仔陣圖像可能根據生成檔案的應用程式無仝所使用格式可能會有細細的區別。
點陣圖檔案頭
這部份的資料角就開始做案件,就用於進行檔案的辨識。典型的應用程式會代先普通讀這部份的資料以確保的確是點陣圖檔案並且無損害。所有的整數值攏以小端序存囥(上低有效位的頭前)。
DIB 頭
這部份共應用程式圖像的詳細資訊,佇螢幕頂懸顯示圖像會使用遮的資訊,伊對檔案的第十五个位元組開始。
這部份資料塊對應矣 Windows 和 OS / 二中的內部使用的頭殼結構以及其他一寡版本的變體。但是所有的版本以一个 DWORD 位(三十二位元)開始,用講明該資料區塊的大細,應用的程式會當根據這个大細來共伊分做圖像實際使用矣佗一種版本的 DIB 頭結構。
存在濟種版本的頭結構的原因是微軟嘿 DIB 格式進行過真濟改擴充。下表即為所有無仝款版本的 DIB 頭:
BITMAPCOREHEADER 了後的版本攏干焦是佇咧前一版本結構尾後追加欄位。
出於相容性的考量,大多數的應用程式使用較舊版本的 DIB 頭儲存檔案。在無考慮 OS / 第二的狀況之下,目前通用的格式為 BITMAPINFOHEADER 版本,內容佇下表中列出。除非有特殊說明,其中所有值攏是無符號整數。
注意:BI \ _ RGB 圖像的圖像大小欄位會當為零。
壓縮方法欄位(位元組 # 三十尺三十三)的有效值如下表:
注意:BI \ _ JPEG 和 BI \ _ PNG 干焦對印表機驅動有效,毋支援螢幕彩現。
除了這以外,OS / 二的 BITMAPCOREHEADER 頭殼嘛無遐鮮:
注意:OS / 二 BITMAPCOREHEADER 的點陣圖攏是猶未壓縮的,而且袂當是十六抑是三十二位元 / 像素。OS / 二 BITMAPCOREHEADER 中的所有值攏為無符號整數。
調色盤
這部份定義了圖像中所用的色水。如何咧講,點陣圖像一个像素接著一个像素儲存,逐个像素使用一个抑是講幾个位元組的值表示,所以調色盤的目的就是欲共應用程式做對應的實際色水。
典型的點陣圖檔案使用 RGB 彩色模型。佇這種模型中,逐種色水攏是由無仝強度(對無到上大強度)的紅色(R)、 青色(G)佮藍色(B)組成的,也就是講,逐種色水攏會使用紅色、綠色佮藍色的值所定義。
佇點陣圖檔案的實現中,調色盤會當包含足濟條目,條目的數就是圖像中間所使用的色水的數。
逐條目共做一个色水,包含四个位元組,其中三个表示藍色的、綠色佮紅色,第四个位元組無咧用(大多數應用程式共設做零); 對每一个位元組,數值零表示這个色水量佇咧進前的色水內底無一使用,數值兩百五十五表示這種色水量使用上大的強度。
像素儲存
表示點陣圖內底親像素的位元是以行為單位對齊儲存的,每一逝的大細攏向上取整為四位元組(三十二位元 DWORD)的倍數。若圖像的懸度大於一,加一个經過填充實現狀齊的行就形成矣像素陣列。
完整儲存的一行像素所需要的位元組數會當通過這个公式計算:
- $ { \ mbox { RowSize } }=\ left \ lfloor { \ frac { { \ mbox { BitsPerPixel } } \ cdot { \ mbox { ImageWidth } } + 三十一 } { 三十二 } } \ right \ rfloor \ cdot 四 , $
- _ ImageWidth _ 以像素為單位
像素陣列
所以這部份逐个像素表示圖像。每一个像素使用一个或者是濟个位元組表示。
通常,像素是按下到上、對倒到正儲存的。毋過你若欲用的毋是 BITMAPCOREHEADER,遐爾仔未壓縮的 Windows 點陣圖閣會使對頂懸到下儉,這个時陣圖像懸度為負值。
每一逝的尾通過填充若干個位元組的資料(並無一定做零)應該行的長度是四位元組的倍數。像素陣列讀入記持體以後,每一逝的起頭地址著愛為四的倍數。這个限制干焦針對記憶體中的像素陣列,針對儉的時陣,干焦要求每一逝的大細為四位元組的倍數,對檔案的偏移無限制。
比如講:對二十四位元色的點陣圖,伊若闊度為一若素,除了每一逝的資料(藍、綠、紅)需要占三位元組外,閣會填充一个元組;若闊為二像素,需要兩位元組的填充;闊為三像素的時陣,需要三位元組添充;是四像素的時陣無需要填充。
圖像相仝的條件下跤,點陣圖檔通常比使用其他壓縮演算法的圖檔大誠濟。
壓縮
索引色的圖像會當使用四位元抑是八位元 RLE 抑是霍夫曼一 D 演算法壓縮。
OS / 二 BITMAPCOREHEADER 二二十四位元色的圖像會當使用二十四位元 RLE 演算法壓縮。
十六位元色參三十二位元色圖像始終為無壓縮資料。
若需要,任何色深的圖像攏會使未壓縮形式儲存。
像素格式的
無論是磁碟上的點陣圖檔案猶原記憶的點陣圖像,像素攏由一組位(英語:bit)表示。
- 每一个若素占一个(色水為一个,一 bpp)支援的格式支援二種無仝色。像素值直接對應一个位的值,上倒像素對應頭一个位元組的上懸位。使用該位的值用來對色表的索引:共零表示色表示中的第一項,為一表示色表中的第二項(即最後一項)。
- 每一个若素占二个(色水為兩位,二 bpp)支援四種無仝色。逐个位元組對應四个像素,上左像素為上懸的兩位(干焦佇咧 Windows CE 中有效)。 需要使用像素值來對一張有四个色水值的色表進行索引。
- 若像素占四位元(色深為四位元,四 bpp)支援十六種無仝的色水。逐个位元組對應兩个像素,上左像素為上懸的四个。需要使用像素值來對一張有十六色值的色表進行索引。
- 若像素占八位元(色為八位元,八 bpp)支援的兩百五十六種無仝的色水。逐个位元組對應一个像素。需要使用像素值來對一張有兩百五十六色水值的色水表進行索引。
- 若像素占十六位元(色深為十六位元,十六 bpp)的格式支援六配五千五百三十六種無仝的色水,每兩个位元組(byte)對應一个像素。該像素的無透明度(英語:alpha)、 紅、綠、藍採樣值就儲存佇咧該兩个位元組中。
- 若像素占二十四位元(色深為二十四位元,二十四 bpp)的格式支援一千六百七十七點七千二百十六種無仝的色水,每三个位元組對應一个像素。
- 每一个素占三十二位元(色水深為三十二位元,三十二 bpp)格式支援四十二追九千四百九十六曲七千兩百九十六種無仝的色水,每四个位元組對應一个像素。
為著咧分一个色水的值得是佗一寡位表示佗一種採樣值,DIB 頭予出一套預設規則,同時凡勢使用 BITFIELDS 共某組位指定做像素中的某一个通道。
其他
就算檔案大細較大,但是點陣圖檔案的簡單性、佇微軟視窗佮其他所在的廣泛使用猶閣有這種格式的優秀文件標準猶閣有專利約束,予伊成做其他作業系統圖像處理程式會當讀寫的一種上定用的格式。
X Window System 使用類似的. XBM格式表示一个烏白圖像以及. XPM(pixelmap)表示彩色圖像。另外閣有一種. RAW格式,伊除了儲存原始的資料以外無任何其他的資訊。其他閣有 Portable Pixmap file format(. PPM)和 Truevision TGA(. TGA), 但是𪜶用甲真少抑是干焦用佇特殊的目的。就算講其他的格式也囥做「點陣圖」(佮量圖無仝), 但是𪜶使用資料壓縮抑是色水索引,所以𪜶毋是嚴格意義上的點陣圖。
因為包含有趁錢的資訊,真濟 BMP 檔案使用類似 ZIP 按呢無失真的資料壓縮演算法會當取得真好的壓縮效果。
參見
- 圖檔較式式
- Windows Picture and Fax Viewer
參考文獻
- Feng Yuan:《 Windows Graphics Programming—— Win 三十二 GDI and DirectDraw》,Prentice Hall PTR,一 st ed .,二千五十二孵一,ISBN : 空白十三鋪八陽六千九百八十五五鋪六 , 一千兩百三十四 pages . Chapter 十 : Bitmap Basics ; Chapter 十一 : Advanced Bitmap Graphics ; Chapter 十二 : Image Processing Using Windows Bitmaps ;
外部連結
- Microsoft's MSDN page on Bitmaps
- Bitmap Storage Explanation
- Bitmap File Structure
- An introduction to DIBs ( Device Independent Bitmaps )
- Example BMP images with various internal formats
- Turbo C + + 三-c零 Code to open 十六-color bitmaps in DOS
- 點陣圖(Bitmap)檔案格式 by chiapei