一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 如何通過UltraEdit解析BMP文件內部結構(BMP位圖基礎)

如何通過UltraEdit解析BMP文件內部結構(BMP位圖基礎)

2021-12-23 14:48CS_Lee_ C/C++

我們先打開畫圖隨便畫一幅圖并采用24位bmp圖像格式保存,就得到了一張24位真彩色的位圖,下面我們來詳細分析bmp位圖的各個組成部分,感興趣的朋友跟隨小編一起看看吧

初見位圖

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

如何通過UltraEdit解析BMP文件內部結構(BMP位圖基礎)

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

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

 

位圖文件的基本結構

1.文件頭信息塊

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

// 文件信息頭結構體
typedef struct tagBITMAPFILEHEADER
{
  unsigned short bfType;
  // 19778,必須是BM字符串,對應的十六進制為0x4d42,十進制為19778,否則不是bmp格式文件
  unsigned int   bfSize;        // 文件大小 以字節為單位(2-5字節)
  unsigned short bfReserved1;   // 保留,必須設置為0 (6-7字節)
  unsigned short bfReserved2;   // 保留,必須設置為0 (8-9字節)
  unsigned int   bfOffBits;     // 從文件頭到像素數據的偏移  (10-13字節)
} BITMAPFILEHEADER;

2.圖像描述信息塊

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

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

3.顏色表

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

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

4.圖像數據區

位圖數據 (由圖像尺寸決定)每一個像素的信息在這里存儲

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

 

具體例子

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

如何通過UltraEdit解析BMP文件內部結構(BMP位圖基礎)

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

如何通過UltraEdit解析BMP文件內部結構(BMP位圖基礎)

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

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

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

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

unsigned short bfType          = 0x4D42     = 19778
unsigned int   bfSize          = 0x00222C36 = 2239542字節=269986/(1024*1024)=2.13MB
unsigned short bfReserved1     = 00 00
unsigned short bfReserved2     = 00 00
unsigned int   bfOffBits       = 0X00000036 = 0x36 = 54字節

unsigned int   biSize          = 0x00000028 = 0x28  = 40字節(圖像信息頭結構體大小就是40字節)
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位真彩色格式保存,所以沒有顏色表信息。緊跟著上述文件頭信息塊和圖像
描述信息塊存儲的信息的就是圖像數據區的信息。每一個像素為24位,即3字節,例如緊跟著
的FFFFFF這三個字節就代表白色*/

到此這篇關于如何通過UltraEdit解析BMP文件內部結構(BMP位圖基礎:)的文章就介紹到這了,更多相關UltraEdit BMP位圖文件內部結構內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/zimuzi2019/article/details/106188788

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
主站蜘蛛池模板: 欧美日韩亚洲国内综合网俺 | 久久AV国产麻豆HD真实 | 精品伊人 | 天天爱综合 | 娇妻被健身教练挺进小说阅读 | 亚洲国产精品第一页 | 日韩欧美高清一区 | 大陆黄色片 | 福利视频免费 | 翁公与小莹在客厅激情 | 91精品手机国产在线观 | 51国产午夜精品免费视频 | 天天色综合三 | 国产探花在线视频 | 毛片免费毛片一级jjj毛片 | julianann办公室 | 日本天堂视频在线观看 | 欧美成人一区二区 | 跪趴好紧h | 千金肉奴隶免费观看 | 欧美大片一区二区三区 | 亚洲国产精品自在现线让你爽 | 女人叉开腿让男人桶 | 韩国成人毛片aaa黄 含羞草国产亚洲精品岁国产精品 | 日出水了特别黄的视频 | 国产精品国色综合久久 | 色中色导航 | 国产资源免费 | 波多野结衣之高校教师 | 五月婷婷丁香色 | 国产精品va在线观看手机版 | 视频一区二区三区欧美日韩 | 韩国免费特一级毛片 | 免费成人在线观看视频 | 国产午夜精品久久久久小说 | 青青草原社区 | 青青草原国产视频 | 日本wwxx护士 | 草逼视频网址 | 1024国产高清精品推荐 | 成人日b视频|