數位影像概念整理【4】——bmp、DIB檔案格式

來源:互聯網
上載者:User

如何處理視頻訊號?視頻訊號種類很多,RGB,YUV,CVBS,S-VIDEO等等,學電子的,搞視頻影像處理的,可能最終會用到上位機處理。我就是這樣,呵呵,前段時間做了YUV資料的影像處理,用68013從CMOS sensor採集而來,上位機用GDI做的,費了不少勁,要瞭解YUV,就要瞭解RGB,要瞭解RGB,就要瞭解bmp圖片,記憶體存放順序,等等。

          bmp圖片可以說是最簡單的格式了,尾碼一般是.bmp或.DIB,關於DIB格式,隨便百度下,或找本VC介紹GDI的書看看就明白了,下面以一個例子來說明,估計這樣好理解點,印象也深刻。

      1 .首先,用Windows內建的畫圖程式建立一個紅綠兩色的圖片,尺寸大小640×480像素,如:

    

          OK,現在我們用UltraEdit開啟這幅bmp圖片,看到的是這樣的16進位數:

     

     2 .我們觀察:從地址36H開始到最後有多少個位元組,最後是E1035H,E1035-36+1(別說為什麼要+1),
結果是E1000,十進位就是921600;

    好,然後我們看以下,640×480×3等於多少呢?bingo!640×480×3=921600;

        為什麼呢?呵呵,下面解釋(有人問為什麼從36H開始的話,等等下面再說!!):

首先我們用畫圖程式建立的bmp檔案是RGB24格式的,我們建立的640×480的圖片,意思是這個圖片含有640×480個像素(別說不知道什麼是像素--!)RGB24格式(也就是RGB888)是指一個像素用RGB表示,有3個位元組,R,G,B各佔8位共24位,這就為什麼叫RGB24或RGB888的原因了;

     那麼,現在清楚了吧,640×480個像素,一個像素(R/G/B三個分量)佔3個位元組,那剛好就是921600個位元組;所以我們就知道了,從36H開始,一直到最後,就是這幅圖的映像資料資訊

     3.然後我們看上面的紅綠圖片,按照上面說的,第一個像素應該是紅色,RGB值應該是(255,0,0)。

好,那麼我們來看下面的16進位圖,從36H開始,36H,37H,38H這3個連續的位元組表示第一個像素,依次是:00 00 FF,也就是RGB(0,0,255)-這是藍色的RGB值!!為什麼會這樣呢?

      這是因為一個像素的RGB值在記憶體中的排列不是RGB,而是BGR這樣排列的,所有像素排列是BGRBGRBGRBGR.....,所以00 00 FF表示的RGB值應該是B-00,G-00,R-255,就是(255,0,0)紅色的RGB值了,呵呵~

    4. 下面說為什麼從36H開始:

      首先,我們知道,圖片有很多種,bmp啊,jpg啊,gif啊等等,那麼36H以後是映像資訊,那麼映像的格式在哪裡儲存呢?嘿嘿,就在前面的54個位元組中(0-35H,10進位就是54),當然,這54個位元組還有其他資訊。

     對照上面第二個16進位數的圖:

0000H-0001H(2位元組):42 4D——表示該檔案是bmp檔案

0002H-0005H(4位元組):36 10 0E 00——整個bmp檔案的大小(單位位元組)。按照記憶體中資料存放地位在   

                                    前,高位在後的原則,這個數是 實際是000E1036,10進位是 921654=640×480

                                   ×3+54(位元組)。

0006H-0009H(4位元組):00 00 00 00——系統保留,必須設定為0

000AH-000DH(4位元組):36 00 00 00——從bmp檔案開始到位元影像資料開始之間的位移量(位元組)。也就是

                                     映像資料前的54個位元組,00000036,10進位是54.

000EH-0011H(4位元組):28 00 00 00——位元影像資訊頭的的長度

0012H-0015H(4位元組):80 02 00 00——位元影像寬度,單位像素。00000280,10進位是640.

0016H-0020H(4位元組):E0 01 00 00——位元影像高度,單位像素。000001E0,10進位是480.

001CH-001DH(2位元組):18 00——每個像素的位元。RGB24當然每個像素24位了,16進位的18.

001EH-0021H(4位元組):00 00 00 00——0,表示不壓縮(BI_RGB)。

0022H-0025H(4位元組):00 10 0E 00——用位元組數表示的位元影像資料大小。000E1000就是640×480

0026H-0029H(4位元組):00 00 00 00——用像素/米表示的水平解析度。

002AH-002DH(4位元組):00 00 00 00——用像素/米表示的垂直解析度。

002EH-0031H(4位元組):00 00 00 00——位元影像使用的顏色數

0032H-0035H(4位元組):00 00 00 00——指定重要的顏色數,為0表示所有顏色都重要。

         以上的54位元組意義可以很容易和VC中位元影像資訊頭結構體聯絡起來:

在VC中定義的位元影像資訊頭為:

      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;

       可以和上面的一一對應,具體每個參數的意義,自行可查閱MSDN。

                                                好了,寫到這裡,下次寫下各種視頻資料格式吧,也就從網上東抄西摘了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.