數字圖像與機器視覺基礎入門——圖片格式入門學習(BMP)


數字圖像與機器視覺基礎入門——圖片格式入門學習(BMP)

1)用圖畫板或其他圖像編輯軟件(Photoshop/GIMP、cximage、IrfanView等)打開一個彩色圖像文件,將其分別保存為 32位、16位彩色和256色、16色、單色的位圖(BMP)文件,對比其文件大小,並計算分析這些圖片在內存中的存儲容量是多少?當保存為BMP文件時,將用文件頭來記錄圖像的屬性,請問:BMP文件頭是多大?是什么格式?上述5個類型的BMP的文件頭內容有什么差異?

一、位圖(BMP)

1、簡介

BMP是英文Bitmap的簡寫,它是Windows操作系統中的標准圖像文件格式,能夠被多種Windows應用程序所支持。隨着Windows操作系統的流行與豐富的Windows應用程序的開發,BMP位圖格式理所當然地被廣泛應用。這種格式的特點是包含的圖像信息較豐富,幾乎不進行壓縮,但由此導致了它與生俱來的缺點--占用磁盤空間過大。所以,BMP在單機上比較流行。

位圖文件的總體構造如下

BMP文件的數據按照從文件頭開始的先后順序分為四個部分:

1bmp文件頭(bmp file header):提供文件的格式、大小等信息

2位圖信息頭(bitmap information):提供圖像數據的尺寸、位平面數、壓縮方式、顏色索引等信息

3調色板(color palette):調色板就是索引與其對應的顏色的映射表

4位圖數據(bitmap data):保存的各個像素的顏色,也就是圖像數據

下面結合Windows結構體的定義,通過一個表來分析這四個部分。

img

我們先將,將jpg格式的原圖分別保存為單色,16色,24色,256位圖,再分析具體內容,轉換成bmp的結果大小分別如下

1639038398225

1639039167042

我們再通過notepad++將文件讀取成為hex格式分析每個部分

(PS:在bmp文件中如果一個數據需要用幾個字節來表示的話,那么該數據的存放字節順序為“低地址村存放低位數據,高地址存放高位數據”,即小端方式也就是倒過來的)

2、文件頭

正如前面說的文件頭包含了圖片的相關文件信息,具體的內容介紹如下表

1639038877058

對照着我們剛剛的圖片進行分析,通過notepad打開單色位圖文件,然后使用hexeditor打開

1639039700648

在0--1 他的數據時 424d,424dh = 'BM',表示這是Windows支持的位圖格式。有很多聲稱開頭兩個字節必須為'BM'才是位圖文件,從上表來看應為開頭兩個字節必須為'BM'才是Windows位圖文件。

2-5 :0697beh 這個是表示的這個圖片的大小

1639039385718

通過進制轉換可以得到為432062,對比文件信息發現是一致的

1639039417669

6-9 :這里為保留字段都要為0

A-D:0000003e 表示這圖片數據的偏移字節,轉化為十進制為62,再在后面可以驗證這個數字

3、位圖信息頭

同樣地,Windows為位圖信息頭定義了如下結構體:

1639039632482

繼續對照數據文件

1639039680560

0E-11:00000028h = 40,這就是說我這個位圖信息頭的大小為40個字節,前面我們已經說過位圖信息頭一般有40個字節,既然是這樣,為什么這里還要給一個字段來說明呢?當時由於要區別不同的版本字節頭是有不同大小的,如下圖所示

1639039823964

​ 出於兼容性的考慮,大多數應用使用了舊版的位圖信息頭來保存文件。而 OS/2 已經過時了,因此現在最常用的格式就僅有V3 header了。因此,我們在前面說位圖信息頭的大小為40字節。

12-15:000008fch = 2300,表示圖像寬為2300像素,

16-19:000005dch = 1500,表示圖像高為1500像素。還有通過這里可以發現這是一個正數,說明圖像數據是從圖像左下角到右上角排列的。

通過查看圖片屬性發現是一致的,這個圖片就是2300*1500像素大小的

1639039944165

1A-1B:0001h, 該值總為1。

1C-1D:0001h = 1, 表示每個像素占1個比特,即該圖像共有2種顏色。由於這里是單色位圖所以是溫和的

1E-21:00000000h,代表BI_RGB, 說明本圖像不壓縮。

22-25:00069780h,在使用BI_RGB時可以設置為0,但我這里他表示是圖像的大小

26-29:00001274h,水平分辨率

2A-2D:00001274h,垂直分辨率

2E-31:00000000h ,本來表示的本位圖實際使用的顏色索引數,閱讀上文的表格可得知這個圖片這里為0表示需要所有的調色板項

32-35:00000000h ,本來說明本位圖重要的顏色索引數為多少,這個圖片這里為零表示都很重要。

4、調色板

下面的數據就是調色板了。調色板其實是一張映射表,標識顏色索引號與其代表的顏色的對應關系。它在文件中的布局就像一個二維數組 其中N表示總的顏色索引數,每個里頭的四個元素分別表示該索引對應的B、G、R和Alpha的值,每個分量占一個字節。如不設透明通道時,Alpha為0。

在我這里使用的圖片中,只有2個顏色索引。也就是從36開始到3d的8個字節00 00 00 00 和 FF FF FF 00,由於沒設透明度所以Alpha是0,只有兩個顏色所以一個是白色一個是黑色。

1639041183845

現在我們再來看最開始的位圖信息偏移量的那個62

一共有2種顏色,每個顏色占用4個字節,就是一共8個字節,再加上前面的文件信息頭和位圖信息頭的54個字節加起來一共是62個字節。也就是說在位圖數據出現之前一共有62個字節,與我們在文件信息頭得到的信息:文件頭到文圖數據區的偏移為62個字節一致,也就是像0A--0D中數據一樣,位圖文件從3E開始。

5、位圖數據

下面就是位圖數據了,每個像素占一個字節,取得這個字節后,以該字節為索引查詢相應的顏色,並顯示到相應的顯示設備上就可以了。

注意:由於位圖信息頭中的圖像高度是正數,所以位圖數據在文件中的排列順序是從左下角到右上角,以行為主序排列的。

也即我們見到的第一個像素60是圖像最左下角的數據,第二個人像素60為圖像最后一行第二列的數據,…一直到最后一行的最后一列數據,后面緊接的是倒數第二行的第一列的數據,依此類推。

如果圖像是24位或是32位數據的位圖的話,位圖數據區就不是索引而是實際的像素值了。下面說明一下,此時位圖數據區的每個像素的RGB顏色陣列排布:

24位RGB按照BGR的順序來存儲每個像素的各顏色通道的值,一個像素的所有顏色分量值都存完后才存下一個下一個像素,不進行交織存儲。

32位數據按照BGRA的順序存儲,其余與24位位圖的方式一樣。

像素的排布規則與前述一致。

2)將一幅彩色照片分別保存為BMP、JPG、GIF和PNG格式,對比它們的文件大小比,判斷圖像的壓縮保存后的壓縮比率。

二、其他圖片格式以及圖像壓縮比率

首先依然是將原圖存儲為另外幾種格式的圖片,查看文件大小如下

1639041617097

對比文件大小可以發現,png壓縮約為20%,jpg約為5%,gif約為10%

(關於另外幾種圖片格式具體內容以后有機會在學習,再對這博客進行補充吧,先完成作業要緊😀)

參考網站:

https://blog.csdn.net/nicholas_duan/article/details/90717599


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM