關於BMP格式的分析

2021-08-27 13:02:14 字數 1361 閱讀 3887

bmp格式是一種比較簡單的儲存格式,bmp檔案分為四個部分,第一是檔案頭資訊塊佔14個位元組,第二部分是影象描述資訊塊,佔36位元組,第三部分是顏色表,佔4個位元組和但是我們目前用不到,第四部分是影象資料區,那就要看大小了。

二、讀取的時候,因為它是按順序讀的,不重不漏,所以我用的是先新建兩個byte陣列,先把頭檔案中14+40個位元組讀取到這兩個陣列中。而畫圖時,我們要用到的第二個陣列中指定位置的幾個位元組,但是要用到的應該是int型的,所以要有個方法把4個byte轉化為1個int

/*** 要將乙個位元組轉化為乙個int

* @param bb byte陣列

* @param lenth 起點位置

* @return 返回的int型資料

*/public int changeint(byte bb,int lenth)

這個方法就是取特定lenth及前面3個byte,並且把它們按照bb[lenth]、bb[lenth-1]、bb[lenth-2]、bb[lenth-3]的順序再拼接起來,就得到這個int數的儲存順序。

三、標頭檔案中我們要用到的就是height、width。接下來就是讀取影象資料區了,因為bmp中是每個點按它的r、g、b值存的,而且是從左下角開始一行一行讀的。這樣我們就可以弄三個二維陣列存每個點的r、g、b值,這樣我們重繪時就可以把每個點按它的r、g、b值設顏色然後再畫就行了。具體讀取方法**如下:

/*** 獲取影象資料

*/public void readbmp()

for(int i=height-1;i>=0;i--)

舉個例子,int i=600*600*3(這是我的影象資料大小)

i轉化為2進製是100000111101011000000,這個方法取第乙個a[0]是用11111111和i做或運算,這樣就是把i除最後面8個位儲存了其他就都變成了0,這樣就儲存了前面8個,也就是11000000 也就是十進位制的192 十六進製制的co,同理,a[1]是只取到了i從後面數第9到第16位的值,也就是01111010 十進位制的122,十六進製制的7a,a[2]為 10000 ,十進位制的16,十六進製制的10,a[3]為0;寫入檔案的時候也就是c0 7a 10 00.

標頭檔案中其他數也是按照其他寫入的。

關於那個影象資料,因為我是畫到bufferedimage上面的,而bufferedimage中有乙個getrgb()方法,返回的是乙個int型數,而它只有三個byte存了資料,就是後面三個,所以我們要取到這個三個byte,再分別寫入

for(int i=599;i>=0;i--)

}也就是把每個點的rgb按順序存進去,這樣就基本上把整個檔案寫好了。我現在儲存自己畫的能被自己寫的程式讀取,也能被系統讀取了!!!!

總結一點就是,只要知道它的訪問規則,也就是協議,理論上什麼檔案都可以讀取寫入的。下次可以嘗試其他的檔案。

關於bmp格式

bmp格式了解 先看一下bmp的頭檔案格式 注意 以上的多位元組型別,如int32是以先高位後低位儲存的,如位檔案大小 0002 0005,int32型別,要按第5 4 3 2位元組順序組合,得到的整數才是正確的。有了標頭檔案資訊後,我們就可以找到位圖資料。位圖資料是以4個位元組 32位,對應32位...

關於BMP檔案格式的詳解

什麼是bmp bmp 全稱bitmap 是windows作業系統中的標準影象檔案格式,可以分成兩類 裝置相關位圖 ddb 和裝置無關位圖 dib 使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,不採用其他任何壓縮,因此,bmp檔案所占用的空間很大。bmp檔案的影象深度可選lbit 4bit ...

BMP格式詳解

列舉 c windows blue lace 16.bmp 位 件頭的格式 typedef structbitmapfileheader 檔案頭結構體,14位元組 typedef structbitmapinfoheader 位圖資訊頭,40位元組 bmp檔案詳解 2 2007 03 21 12 2...