圖像數據在計算機儲器設備中的存儲形式是圖像文件,圖像必須按照某個公開的、規范約終結定的數據存儲順序和結構進行保存,才能使不同的程序對圖像文件順利進行打開或存盤操作,實現數據共享。圖像數據在文件中的存儲順序和結構稱為圖像文件格式。目前主流的圖像文件格式有 .bmp; .jpg;.jpeg;.png;.gif;.webp;.tiff;.psd 等各種不同的文件格式。在這些圖像格式中大部分的格式,都是將像素數據經過壓縮編碼后進行保存的,這里涉及到比較復雜的圖像壓縮算法等操作,只有BMP格式的文件是支持原始圖像數據保存的,本章重點針對BMP文件格式進行詳細講述。
BMP(全稱Bitmap)是Windows操作系統中的標準圖像文件格式,可以分成兩類:設備相關位圖(DDB)和設備無關位圖(DIB),使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此,BMP文件所占用的空間很大。BMP文件的圖像深度可選 1bit、4bit、8bit及24bit。BMP文件存儲數據時,圖像的掃描方式是按從左到右、從下到上的順序。由于BMP文件格式是Windows環境中交換與圖有關的數據的一種標準,因此在Windows環境中運行的圖形圖像軟件都支持BMP圖像格式。在Windows系統平臺上和Android手機上,直接使用系統默認的圖片瀏覽器即可打開。
一、BMP文件格式詳解
BMP文件總共由四個部分構成:
(1)BMP文件頭(bmp file header):提供文件的格式、大小等信息
(2)位圖信息頭(bitmap information):提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息
(3)調色板(color palette):可選,如使用索引來表示圖像,調色板就是索引與其對應的顏色的映射表,在使用 256位彩色、16位彩色等情況下用到
(4)位圖數據(bitmap data):就是圖像的像素數據

1、BMP文件頭部分
固定占用14個字節,包括文件類型表示、文件大小、像素數據偏移等信息

2、位圖信息頭
固定占用40個字節,包含了圖像的基本新,例如:像素的寬度、高度、色彩格式位數、是否有壓縮(絕大部分情況下無壓縮)等。

3、調色板信息
這一項是可選項,適用于索引方式偽彩色的圖像數據。調色板其實是一張映射表,標識顏色索引號與其代表的顏色的對應關系。總共有256個索引,每個索引對應一個RGBA四字節的色彩值,而后續位圖數據只需要保存每個像素點的索引,根據索引找到對應的RGBA數據值。根據索引列表大小,該部分信息總計占用 256*4=1024個字節。

偽彩色方式在過去計算機存儲空間不足的情況下,采用的一種平衡內存和效果的方式,由于現在硬件成本的大幅度下降,所以現在這種方式在絕大部分甚至嵌入式設備上也很少使用了,因此本章節也不對該部分詳細講述。
4、位圖數據
這部分存放的就是詳細的每個像素的RGB或者RGBA數據。存放順序從左到右、從下到上的順序存放。 這里有兩點需要注意一下:
(1)像素RGB值存放時,先存放圖像最下面一行數據,然后再存放下面倒數第二行數據,所以存放順序是倒的,這個跟正常瀏覽順序不一樣。
(2)每一行像素數據需要保證4字節對齊,不對齊的需要補充空字節,這個是BMP文件格式本身要求的。對于RGBA 32位色彩格式來說沒有任何問題,但是對于Gray或者RGB格式的數據 ,有時一行像素需要補充一些空字節。例如:對于寬高為 322*240 像素的RGB數據,正常計算一行像素數據需要 322 * 3= 966字節,但是966不是四字節對齊,所以在存儲時,每行的像素數據要保存為 968字節,最后2個字節保留。
二、BMP文件讀寫操作
針對如上的BMP文件格式,我們使用C語言來實現對于.bmp文件的讀寫操作,考慮到調色板格式的色彩格式現在幾乎不再使用,因此我們代碼中也不考慮這種情況。
//
總結
本章主要講解了對于非壓縮的RGB、RGBA像素格式的圖像數據保存到.bmp文件的方法。.bmp文件是使用最廣泛的文件格式之一,支持的平臺眾多,也是存儲和加載最方便的一種圖像格式。在后續教程中,我們可以隨時將算法處理過程中的圖像數據保存下來查看圖像內容,從而方便調試。而其他格式的圖片可以通過工具方便的轉換為.bmp圖片,在Windows平臺上最簡單的一種方式是:使用Windows系統自帶的畫圖程序,打開任意格式的圖像文件,然后選擇另存為 .bmp即可。
文章系列目錄
華叔-視覺魔術師:圖像算法原理與實踐——緒論?zhuanlan.zhihu.com