溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)

發(fā)布時(shí)間:2021-08-26 18:23:00 來(lái)源:億速云 閱讀:287 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)”,在日常操作中,相信很多人在怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

目錄
  • 初見位圖

  • 位圖文件的基本結(jié)構(gòu)

    • 1.文件頭信息塊

    • 2.圖像描述信息塊

    • 3.顏色表

    • 4.圖像數(shù)據(jù)區(qū)

  • 具體例子

    初見位圖

    我們先打開畫圖隨便畫一幅圖并采用24位bmp圖像格式保存,就得到了一張24位真彩色的位圖

    怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)

    BMP位圖一般由4部分組成:文件頭信息塊、圖像描述信息塊、顏色表(在真彩色模式無(wú)顏色表)和圖像數(shù)據(jù)區(qū)組成,以BMP為擴(kuò)展名保存。
    打開Windows的畫圖程序,在保存圖像時(shí),可以看到三個(gè)選項(xiàng):2色位圖(黑白)、16色位圖、256色位圖和24位位圖。這是最普通的生成位圖的工具,在這里講解的BMP位圖形式,主要就是指用畫圖生成的位圖. 一般的bmp圖像都是24位,也就是真彩。每8位為一字節(jié),24位也就是使用三字節(jié)來(lái)存儲(chǔ)每一個(gè)像素的信息,三個(gè)字節(jié)對(duì)應(yīng)存放r,g,b三原色的數(shù)據(jù)每個(gè)字節(jié)的存貯范圍都是0-255。那么以此類推,32位圖即每像素存儲(chǔ)r,g,b,a(Alpha通道,存儲(chǔ)透明度)四種數(shù)據(jù)。8位圖就是只有灰度這一種信息,還有二值圖,它只有兩種顏色,黑或者白。

    接下來(lái)逐個(gè)分析BMP位圖的各個(gè)組成部分

    位圖文件的基本結(jié)構(gòu)

    1.文件頭信息塊

    文件信息頭 (14字節(jié))存儲(chǔ)文件類型,文件大小等信息

    // 文件信息頭結(jié)構(gòu)體
    typedef struct tagBITMAPFILEHEADER
    {
        unsigned short bfType;
        // 19778,必須是BM字符串,對(duì)應(yīng)的十六進(jìn)制為0x4d42,十進(jìn)制為19778,否則不是bmp格式文件
        unsigned int   bfSize;        // 文件大小 以字節(jié)為單位(2-5字節(jié))
        unsigned short bfReserved1;   // 保留,必須設(shè)置為0 (6-7字節(jié))
        unsigned short bfReserved2;   // 保留,必須設(shè)置為0 (8-9字節(jié))
        unsigned int   bfOffBits;     // 從文件頭到像素?cái)?shù)據(jù)的偏移  (10-13字節(jié))
    } BITMAPFILEHEADER;

    2.圖像描述信息塊

    圖片信息頭 (40字節(jié))存儲(chǔ)著圖像的尺寸,顏色索引,位平面數(shù)等信息

    //圖像信息頭結(jié)構(gòu)體
    typedef struct tagBITMAPINFOHEADER
    {
        unsigned int    biSize;          // 此結(jié)構(gòu)體的大小 (14-17字節(jié))
        long            biWidth;         // 圖像的寬  (18-21字節(jié))
        long            biHeight;        // 圖像的高  (22-25字節(jié))
        unsigned short  biPlanes;        
        // 表示bmp圖片的平面屬,顯然顯示器只有一個(gè)平面,所以恒等于1 (26-27字節(jié))
        unsigned short  biBitCount;      // 一像素所占的位數(shù),一般為24   (28-29字節(jié))
        unsigned int    biCompression;   // 說(shuō)明圖象數(shù)據(jù)壓縮的類型,0為不壓縮。 (30-33字節(jié))
        unsigned int    biSizeImage;     
        // 像素?cái)?shù)據(jù)所占大小, 這個(gè)值應(yīng)該等于上面文件頭結(jié)構(gòu)中bfSize-bfOffBits (34-37字節(jié))
        long            biXPelsPerMeter; // 說(shuō)明水平分辨率,用象素/米表示。一般為0 (38-41字節(jié))
        long            biYPelsPerMeter; // 說(shuō)明垂直分辨率,用象素/米表示。一般為0 (42-45字節(jié))
        unsigned int    biClrUsed;       
        // 說(shuō)明位圖實(shí)際使用的彩色表中的顏色索引數(shù)(設(shè)為0的話,則說(shuō)明使用所有調(diào)色板項(xiàng))。 (46-49字節(jié))
        unsigned int    biClrImportant;  
        // 說(shuō)明對(duì)圖象顯示有重要影響的顏色索引的數(shù)目,如果是0,表示都重要。(50-53字節(jié))
    } BITMAPINFOHEADER;

    3.顏色表

    調(diào)色板 (由顏色索引數(shù)決定)(可以沒(méi)有此信息,下面的例子就因?yàn)椴捎昧?4位真彩色保存所以沒(méi)有這部分信息

    //24位圖像素信息結(jié)構(gòu)體,即調(diào)色板
    typedef struct _PixelInfo {
        unsigned char rgbBlue;   //該顏色的藍(lán)色分量  (值范圍為0-255)
        unsigned char rgbGreen;  //該顏色的綠色分量  (值范圍為0-255)
        unsigned char rgbRed;    //該顏色的紅色分量  (值范圍為0-255)
        unsigned char rgbReserved;// 保留,必須為0
    } PixelInfo;

    4.圖像數(shù)據(jù)區(qū)

    位圖數(shù)據(jù) (由圖像尺寸決定)每一個(gè)像素的信息在這里存儲(chǔ)

    顏色表接下來(lái)位為位圖文件的圖像數(shù)據(jù)區(qū),在此部分記錄著每點(diǎn)像素對(duì)應(yīng)的顏色號(hào),其記錄方式也隨顏色模式而定,既2色圖像每點(diǎn)占1位(8位為1字節(jié));16色圖像每點(diǎn)占4位(半字節(jié));256色圖像每點(diǎn)占8位(1字節(jié));真彩色圖像每點(diǎn)占24位(3字節(jié))。所以整個(gè)數(shù)據(jù)區(qū)的大小也會(huì)隨之變化。究其規(guī)律而言,可的出如下計(jì)算公式:圖像數(shù)據(jù)信息大小=(圖像寬度 * 圖像高度 * 記錄像素的位數(shù))/8。

    具體例子

    右鍵單擊我們開頭畫的圖片可以查看該圖片的分辨率,寬度,高度和位深度。為1152 * 648像素。這是一張24位真彩色位圖。1152 * 648 = 746496像素,746496像素 * 24位/像素 / (8 * 1024 * 1024)位 =2.13 MB,與顯示的圖片大小相符。

    怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)

    接下來(lái)用UltraEdit打開這張BMP圖像,顯示的是十六進(jìn)制的代碼

    怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)

    現(xiàn)在我們來(lái)讀取這些代碼,看看他們到底保存了一些啥東西。 在這里要注意的是

    Windows的數(shù)據(jù)是倒著念的,這是PC電腦的特色。如果一段數(shù)據(jù)為42 4D,倒著念就是4D 42,即0x4D42。 因此,如果bfSize的數(shù)據(jù)為A2 1E 04 00,實(shí)際上就成了0x00041EA2,也就是0x41EA2。

    參照上面的文件信息頭結(jié)構(gòu)體內(nèi)容對(duì)這幅位圖的內(nèi)容進(jìn)行分析。文件信息頭結(jié)構(gòu)體第一個(gè)數(shù)據(jù)是unsigned short(16位)類型的bfType變量。觀察十六進(jìn)制代碼結(jié)果可以看到第一行開頭的42 4D倒著念就是4D 42(剛好16位對(duì)應(yīng)unsigned short類型),即bftype=0x4D42(轉(zhuǎn)換為十進(jìn)制為19778,實(shí)際上所有BMP圖像的bfType對(duì)應(yīng)屬性都是這個(gè)值)。按照這個(gè)方法可得出第二個(gè)數(shù)據(jù)bfSize類型為unsigned int(32位),圖中對(duì)應(yīng)的十六進(jìn)制代碼為00222C36(轉(zhuǎn)換為十進(jìn)制為2239542),這代表文件大小為2239542字節(jié)=2.13MB,和我們?cè)趧倓倢傩詸诶锏奈募笮⊥耆嗟取?/p>

    接下來(lái)利用類似的方法可以從十六進(jìn)制代碼中得到這張位圖的文件頭信息塊和圖像描述信息塊所存儲(chǔ)的信息

    unsigned short bfType          = 0x4D42     = 19778
    unsigned int   bfSize          = 0x00222C36 = 2239542字節(jié)=269986/(1024*1024)=2.13MB
    unsigned short bfReserved1     = 00 00
    unsigned short bfReserved2     = 00 00
    unsigned int   bfOffBits       = 0X00000036 = 0x36 = 54字節(jié)
    
    unsigned int   biSize          = 0x00000028 = 0x28  = 40字節(jié)(圖像信息頭結(jié)構(gòu)體大小就是40字節(jié))
    long           biWidth         = 0x00000480 = 0x480 = 1152像素;
    long           biHeight        = 0x00000288 = 0x288 = 648像素 ;
    unsigned short biPlanes        = 0x0001     = 0x1   = 1;
    unsigned short biBitCount      = 0x0018     = 0x18  = 24位;
    unsigned int   biCompression   = 0x00000000 = 0;
    unsigned int   biSizeImage     = 0x00222C00 = 0;(等于bfSize-bfOffBits)
    long           biXPelsPerMeter = 0x00000000 = 0;
    long           biYPelsPerMeter = 0x00000000 = 0;  
    unsigned int   biClrUsed       = 0x00000000 = 0;
    unsigned int   biClrImportant  = 0x00000000 = 0;
    
    /*因?yàn)椴捎昧?4位真彩色格式保存,所以沒(méi)有顏色表信息。緊跟著上述文件頭信息塊和圖像
    描述信息塊存儲(chǔ)的信息的就是圖像數(shù)據(jù)區(qū)的信息。每一個(gè)像素為24位,即3字節(jié),例如緊跟著
    的FFFFFF這三個(gè)字節(jié)就代表白色*/

    到此,關(guān)于“怎么通過(guò)UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI