bmp檔案解析

2021-09-01 18:20:37 字數 3528 閱讀 6897

[size=xx-large]解析bmp影象[/size]

今天做了乙個很好玩的東西————bmp解析器。剛看到的時候我覺得超難,完全不

懂,做出來之後,覺得其實很簡單!接下來就讓我來介紹一下吧!

在真正做解析器之前我們應該先了解一些基礎知識!

[size=x-large]位運算:[/size]

[size=large]1.由byte型轉為int型(下面是4個byte轉為乙個byte)[/size]

(((int)b4&0xff)<<24

|(((int)b3&0xff)<<16)

|(((int)b2&0xff)<<8)

|(((int)b1&0xff)<<0));

如果只是乙個byte轉乙個int只需(((int)b1&0xff)<<0));即可

我在做這個的時候遇到乙個問題:

不會出現問題!但是在解析自己畫板儲存的bmp影象時出現問題!請教大神後,給我的解

釋是對上面這種寫法系統是相容的,但對自己畫板的畫可能不相容!所以影象就會亂!大

/**

* 將4個byte數轉換成int型

* @param b1

* @param b2

* @param b3

* @param b4

* @return

*/public int change(byte b1,byte b2,byte b3,byte b4)

[size=large]2.由int型轉為byte型(將乙個int型別的數data轉換為byte型存入陣列)[/size]

byte b=new byte[4];

b[0]=(byte) ((data>>>0)&0xff);

b[1]=(byte)((data>>>8)&0xff);

b[2]=(byte)((data>>>16)&0xff);

b[3]=(byte)((data>>>24)&0xff);

[size=large]點陣圖的乙個畫素值所佔的位元組數:[/size]

當bibitcount=1時,8個畫素佔1個位元組;

當bibitcount=4時,2個畫素佔1個位元組;

當bibitcount=8時,1個畫素佔1個位元組;

當bibitcount=24時,1個畫素佔3個位元組;

現在開始正題

[size=large]bmp結構: bmp檔案由檔案頭、位圖資訊頭、顏色資訊和圖形資料四部分組成。

1.檔案頭資訊[/size]

bmp檔案頭(14位元組)bmp檔案頭資料結構含有

bmp檔案的型別、檔案大小和點陣圖起始位置等資訊。

檔案型別bm——————————————————2個位元組(4d42)

檔案大小————————————————————4個位元組

保留資訊————————————————————4個位元組

偏移量 ————————————————————4個位元組

bmpdata bd=new bmpdata();

//檔案頭資訊大小

int bheadlen=14;

//建立乙個byte陣列儲存檔案頭資訊

byte bhead=new byte[14];

//將檔案資訊讀入陣列

dis.read(bhead, 0, bheadlen);

//呼叫change將byte轉為int

bd.size=this.change(bhead[2], bhead[3], bhead[4], bhead[5]);

bd.bfoffbits=this.change(bhead[10], bhead[11], bhead[12], bhead[13]);

[size=large]2.點陣圖資訊(我做的是24真彩色)[/size]

位圖資訊頭(40位元組) bmp點陣圖資訊頭資料用於說明點陣圖的尺寸等資訊。

本結構所占用位元組數—————————————4個位元組

點陣圖的寬 ————————————————————4個位元組 (寬和高的順序不能錯)

點陣圖的高 ————————————————————4個位元組

目標裝置的級別————————————————2個位元組

每個畫素所需的位數,必須是1(雙色), 4(16色),8(256色)或24(真彩色)之一

————————————2個位元組

位圖壓縮型別,必須是0(不壓縮)————2個位元組

點陣圖的大小 ——————————————————4個位元組

位圖水平解析度,每公尺畫素數 ——————4個位元組

位圖垂直解析度,每公尺畫素數 ——————4個位元組

位圖實際使用的顏色表中的顏色數 ——4個位元組

位圖顯示過程中重要的顏色數 ——————4個位元組

//位圖資訊頭大小(只取了部分需要的資料)

int bmesslen = 40;

byte bmess=new byte[bmesslen];

dis.read(bmess, 0, bmesslen);

bd.biwidth=this.change(bmess[4], bmess[5], bmess[6], bmess[7]);

bd.bihigh=this.change(bmess[8], bmess[9], bmess[10], bmess[11]);

width=bd.biwidth;

high=bd.bihigh;

[size=large]3.顏色表[/size]

顏色表用於說明點陣圖中的顏色,它有若干個表項,每乙個表項是乙個rgbquad型別的

結構,定義一種顏色。

藍色的亮度(值範圍為0-255)

綠色的亮度(值範圍為0-255)

紅色的亮度(值範圍為0-255)

[size=large]4.點陣圖資料[/size]

位圖資料記錄了點陣圖的每乙個畫素值,記錄順序是在掃瞄行內是從左到右,掃瞄行之間

是從下到上。

//位圖資料大小

int datalen;

//判斷寬度是不是4的整數倍

if(width*3%4==0)else

//將資料存入data二維陣列中

byte data=new byte[high][datalen];

for(int i=0;i//將byte型別的data陣列轉換為int型別

int data1=new int[high][datalen];

for(int i=0;i然後在畫板上畫出即可

/**

* 顯示,即按照給定的資料畫點(從下到上,從左到右)

* @param data:給定的影象的資料

*/public void draw( int data)

x=200;

y--;

system.out.println(x+","+y);

}}

現在覺得不難了吧!

BMP檔案解析

目錄c語言 乙個問題 完整程式 bmp 全稱bitmap 是windows作業系統中的標準影象檔案格式,可以分成兩類 裝置有向量相關位圖 ddb 和裝置無向量相關位圖 dib 使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,不採用其他任何壓縮,因此,bmp檔案所占用的空間很大。bmp檔案的影...

BMP檔案結構解析

一 bmp檔案結構 bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfilehead...

解析 bmp檔案的結構

bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成 bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 位圖資訊頭 bmp點陣...