最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何通過UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)(BMP位圖基礎(chǔ))

 更新時間:2021年08月26日 15:47:30   作者:CS_Lee_  
我們先打開畫圖隨便畫一幅圖并采用24位bmp圖像格式保存,就得到了一張24位真彩色的位圖,下面我們來詳細(xì)分析bmp位圖的各個組成部分,感興趣的朋友跟隨小編一起看看吧

初見位圖

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

在這里插入圖片描述

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

接下來逐個分析BMP位圖的各個組成部分

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

1.文件頭信息塊

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

// 文件信息頭結(jié)構(gòu)體
typedef struct tagBITMAPFILEHEADER
{
    unsigned short bfType;
    // 19778,必須是BM字符串,對應(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;     // 從文件頭到像素數(shù)據(jù)的偏移  (10-13字節(jié))
} BITMAPFILEHEADER;

2.圖像描述信息塊

圖片信息頭 (40字節(jié))存儲著圖像的尺寸,顏色索引,位平面數(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圖片的平面屬,顯然顯示器只有一個平面,所以恒等于1 (26-27字節(jié))
    unsigned short  biBitCount;      // 一像素所占的位數(shù),一般為24   (28-29字節(jié))
    unsigned int    biCompression;   // 說明圖象數(shù)據(jù)壓縮的類型,0為不壓縮。 (30-33字節(jié))
    unsigned int    biSizeImage;     
    // 像素數(shù)據(jù)所占大小, 這個值應(yīng)該等于上面文件頭結(jié)構(gòu)中bfSize-bfOffBits (34-37字節(jié))
    long            biXPelsPerMeter; // 說明水平分辨率,用象素/米表示。一般為0 (38-41字節(jié))
    long            biYPelsPerMeter; // 說明垂直分辨率,用象素/米表示。一般為0 (42-45字節(jié))
    unsigned int    biClrUsed;       
    // 說明位圖實際使用的彩色表中的顏色索引數(shù)(設(shè)為0的話,則說明使用所有調(diào)色板項)。 (46-49字節(jié))
    unsigned int    biClrImportant;  
    // 說明對圖象顯示有重要影響的顏色索引的數(shù)目,如果是0,表示都重要。(50-53字節(jié))
} BITMAPINFOHEADER;

3.顏色表

調(diào)色板 (由顏色索引數(shù)決定)(可以沒有此信息,下面的例子就因為采用了24位真彩色保存所以沒有這部分信息

//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ù) (由圖像尺寸決定)每一個像素的信息在這里存儲

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

具體例子

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

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

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;

/*因為采用了24位真彩色格式保存,所以沒有顏色表信息。緊跟著上述文件頭信息塊和圖像
描述信息塊存儲的信息的就是圖像數(shù)據(jù)區(qū)的信息。每一個像素為24位,即3字節(jié),例如緊跟著
的FFFFFF這三個字節(jié)就代表白色*/

到此這篇關(guān)于如何通過UltraEdit解析BMP文件內(nèi)部結(jié)構(gòu)(BMP位圖基礎(chǔ):)的文章就介紹到這了,更多相關(guān)UltraEdit BMP位圖文件內(nèi)部結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++查詢最短路徑示例

    c++查詢最短路徑示例

    這篇文章主要介紹了c++查詢最短路徑示例,需要的朋友可以參考下
    2014-05-05
  • C++ 名稱空間詳情

    C++ 名稱空間詳情

    當(dāng)一個項目變得大型之后,我們會引入很多的庫,這么一來兩個庫很可能會定義List、Tree、Node同名的類,編譯器要是不考慮這情況的話,程序員調(diào)用時就會出現(xiàn)沖突問題。C++提供了名稱空間工具,以更好的控制名稱的作用域,本文就來談?wù)凜++ 名稱空間,需要的朋友可以參考一下
    2021-09-09
  • 基于C++實現(xiàn)TCP聊天室功能

    基于C++實現(xiàn)TCP聊天室功能

    這篇文章主要為大家詳細(xì)介紹了基于C++實現(xiàn)TCP聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解c++良好的編程習(xí)慣與編程要點

    詳解c++良好的編程習(xí)慣與編程要點

    c++語言的靈活是建立在對編程者個人的編程素質(zhì)的嚴(yán)格要求基礎(chǔ)上的,好的C++編程習(xí)慣能避免很多問題。沒有好的編程習(xí)慣,極有可能編寫一行代碼,編譯器能報十幾個錯誤,而且就算編譯通過了,將來在運行過程中也會有很多莫名奇妙的問題
    2021-06-06
  • C 語言基礎(chǔ)之初識 C 語言常量

    C 語言基礎(chǔ)之初識 C 語言常量

    C語言中的常量分為以下幾種:字面常量、const修飾的常變量、#define定義的標(biāo)識符常量等,下面我們將詳細(xì)對C語言這幾個常量做介紹,感興趣的小伙伴可以參考一下
    2021-09-09
  • C語言中break與continue的用法和區(qū)別詳解

    C語言中break與continue的用法和區(qū)別詳解

    當(dāng)我們使用while或for循環(huán)時,如果想提前結(jié)束循環(huán)(在不滿足結(jié)束條件的情況下結(jié)束循環(huán)),可以使用break或continue關(guān)鍵字,這篇文章主要給大家介紹了關(guān)于C語言中break與continue的用法和區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • C/C++中異常處理詳解及其作用介紹

    C/C++中異常處理詳解及其作用介紹

    這篇文章主要介紹了C/C++中異常處理詳解及其作用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 循環(huán)隊列詳解及隊列的順序表示和實現(xiàn)

    循環(huán)隊列詳解及隊列的順序表示和實現(xiàn)

    這篇文章主要介紹了循環(huán)隊列詳解及隊列的順序表示和實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • c++插入排序詳解

    c++插入排序詳解

    插入排序的基本思想是每次將一個待排序的記錄,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子文件中的適當(dāng)位置,直到全部記錄插入完成為止。下面我們來詳細(xì)探討下C++實現(xiàn)插入排序
    2017-05-05
  • 用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu)

    用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu)

    這篇文章主要介紹了用C語言判斷一個二叉樹是否為另一個的子結(jié)構(gòu),是數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-08-08

最新評論

七台河市| 平乡县| 涞水县| 丰都县| 宾川县| 吉林省| 香港| 板桥市| 南康市| 泗阳县| 泽库县| 濮阳县| 濮阳县| 大足县| 九台市| 如东县| 青阳县| 温宿县| 天长市| 正宁县| 句容市| 德格县| 攀枝花市| 修水县| 涿州市| 英超| 哈尔滨市| 莱阳市| 通化市| 武功县| 扶沟县| 汶上县| 东安县| 海晏县| 墨脱县| 红原县| 报价| 重庆市| 大足县| 阿克苏市| 巩义市|