[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點陣...