新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32 讀取bmp圖像的信息

        stm32 讀取bmp圖像的信息

        作者: 時間:2016-11-13 來源:網絡 收藏
        在sd卡文件系統下讀取bmp圖像和顯示是比較容易的,為了給jpeg解碼提供一個過程,這里我先介紹一下bmp的讀取方式

        這里主要是介紹讀取bmp信息的一些方法

        本文引用地址:http://www.104case.com/article/201611/316547.htm

        首先說一下BMP的4個組成部分:

        1.文件頭信息塊

        0000-0001:文件標識,為字母ASCII碼“BM”。
        0002-0005:文件大小。
        0006-0009:保留,每字節以“00”填寫。
        000A-000D:記錄圖像數據區的起始位置。各字節的信息依次含義為:文件頭信息塊大小,圖像描述信息塊的大小,圖像顏色表的大小,保留(為01)。


        2.圖像描述信息塊

        000E-0011:圖像描述信息塊的大小,常為28H。
        0012-0015:圖像寬度。
        0016-0019:圖像高度。
        001A-001B:圖像的plane總數(恒為1)。
        001C-001D:記錄像素的位數,很重要的數值,圖像的顏色數由該值決定。
        001E-0021:數據壓縮方式(數值位0:不壓縮;1:8位壓縮;2:4位壓縮)。
        0022-0025:圖像區數據的大小。
        0026-0029:水平每米有多少像素,在設備無關位圖(.DIB)中,每字節以00H填寫。
        002A-002D:垂直每米有多少像素,在設備無關位圖(.DIB)中,每字節以00H填寫。
        002E-0031:此圖像所用的顏色數,如值為0,表示所有顏色一樣重要。

        3.顏色表

          顏色表的大小根據所使用的顏色模式而定:2色圖像為8字節;16色圖像位64字節;256色圖像為1024字節。其中,每4字節表示一種顏色,并以B (藍色)、G(綠色)、R(紅色)、alpha(32位位圖的透明度值,一般不需要)。即首先4字節表示顏色號1的顏色,接下來表示顏色號2的顏色,依此類推。

        4.圖像數據區

          顏色表接下來位為位圖文件的圖像數據區,在此部分記錄著每點像素對應的顏色號,其記錄方式也隨顏色模式而定,既2色圖像每點占1位(8位為1字節);16色圖像每點占4位(半字節);256色圖像每點占8位(1字節);真彩色圖像每點占24位(3 字節)。所以,整個數據區的大小也會隨之變化。究其規律而言,可的出如下計算公式:圖像數據信息大小=(圖像寬度*圖像高度*記錄像素的位數)/8。

        前三個 是我們今天要讀取的

        首先我們先用 f_open 找到我們要讀取的圖片文件的信息尤其是圖片開始的簇和指針地址。
        CurFile=BmpFileName;

        F_Open(CurFile);//打開文件
        F_Read(CurFile,jpg_buffer);//讀出512個字節
        pbmp=(BITMAPINFO*)jpg_buffer;//得到BMP的頭部信息

        這是我摘借的幾句程序
        第二句 把讀出的bmp文件信息存在buffer中
        第三句 這句話是我們今天重點說的
        =(BITMAPINFO*)jpg_buffer 強制轉換為 (BITMAPINFO)指針類型

        typedef __packed struct
        {
        BITMAPFILEHEADER bmfHeader;// 1.文件頭信息塊
        BITMAPINFOHEADER bmiHeader;//2.圖像描述信息塊
        RGBQUAD bmiColors[1];// 3.顏色表
        }BITMAPINFO;

        第3句話 強制轉化buffer數組 到這個結構體
        實際上數組和結構體是一樣的 不一樣的是結構體 有個最小結構對齊的問題(這個在本壇有詳細講解)。
        對照著樓上各個信息快 信息字節 寫出結構體:
        //BMP頭文件
        typedef __packed struct
        {
        WORDbfType ; //文件標志.只對BM,用來識別BMP位圖類型
        DWORD bfSize ; //文件大小,占四個字節
        WORDbfReserved1 ;//保留
        WORDbfReserved2 ;//保留
        DWORD bfOffBits ;//從文件開始到位圖數據(bitmap data)開始之間的的偏移量
        }BITMAPFILEHEADER ;
        //BMP信息頭
        typedef __packed struct
        {
        DWORD biSize ; //說明BITMAPINFOHEADER結構所需要的字數。
        LONGbiWidth ; //說明圖象的寬度,以象素為單位
        LONGbiHeight ; //說明圖象的高度,以象素為單位
        WORDbiPlanes ; //為目標設備說明位面數,其值將總是被設為1
        WORDbiBitCount ; //說明比特數/象素,其值為1、4、8、16、24、或32
        DWORD biCompression ;//說明圖象數據壓縮的類型。其值可以是下述值之一:
        //BI_RGB:沒有壓縮;
        //BI_RLE8:每個象素8比特的RLE壓縮編碼,壓縮格式由2字節組成(重復象素計數和顏色索引);
        //BI_RLE4:每個象素4比特的RLE壓縮編碼,壓縮格式由2字節組成
        //BI_BITFIELDS:每個象素的比特由指定的掩碼決定。
        DWORD biSizeImage ;//說明圖象的大小,以字節為單位。當用BI_RGB格式時,可設置為0
        LONGbiXPelsPerMeter ;//說明水平分辨率,用象素/米表示
        LONGbiYPelsPerMeter ;//說明垂直分辨率,用象素/米表示
        DWORD biClrUsed ; //說明位圖實際使用的彩色表中的顏色索引數
        DWORD biClrImportant ; //說明對圖象顯示有重要影響的顏色索引的數目,如果是0,表示都重要。
        }BITMAPINFOHEADER ;
        //彩色表
        typedef __packed struct
        {
        BYTE rgbBlue ; //指定藍色強度
        BYTE rgbGreen ; //指定綠色強度
        BYTE rgbRed ; //指定紅色強度
        BYTE rgbReserved ;//保留,設置為0
        }RGBQUAD ;
        這樣我們可以通過結構體 得到bmp文件任何一個信息。

        下次接著來 直到顯示解碼顯示然后再上傳移植文件



        關鍵詞: stm32讀取bmp圖

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄄城县| 乳山市| 顺义区| 普格县| 密山市| 樟树市| 永和县| 黄大仙区| 泸州市| 霍城县| 商洛市| 女性| 灵武市| 乌鲁木齐市| 德江县| 新兴县| 莱芜市| 东乌珠穆沁旗| 商都县| 扶风县| 驻马店市| 长岛县| 手机| 开阳县| 嵊州市| 响水县| 临高县| 阿拉尔市| 固始县| 雅安市| 枣强县| 百色市| 迁西县| 嘉定区| 米林县| 错那县| 务川| 黄陵县| 共和县| 吉林省| 内丘县|