.bmp 的 offset 怎麼計算?head, info, 然後有個 color 資訊 offset, 再來是 pix1.若解析度已知為 8 or 16 or 24 bits怎麼計算出從一開始讀檔多少 byte 之後就是正好是 pix 開始位址?(如果不使用 WinAPI 的函式)2.若解析度已知為 8 or 16 or 24 bits對於 pix 中 bytes 的佈局內容又有什麼差別?3.我怎麼知道它是長x寬是多?(如果不使用 WinAPI 的函式)問題很大希望有人願意說明指導或給些易懂的參考資料感激不盡 ^^~~
2006-04-24 14:40:05 · 1 個解答 · 發問者 Anonymous in 電腦與網際網路 ➔ 程式設計
因為等級低無法貼圖只好請您參考
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_4v1h.asp
那個下面有提到一個Redbrick.bmp,想利用它來作例子,剛好它最下面也有header等等起始和終了的值可以核對.
下面若是講到offset都是從檔案的起始,也就是0x00算起的
前面的0x00~0x0D也就是14bytes的file header, 然後看到offset 0x0E開始的4個bytes,也就是28 00 00 00,也就是0x00000028=40bytes的info header size,所以info header就是從0x0E~0x35
3. 怎知長寬?
info header中緊接著info header size的4個bytes是width,再過來4個bytes是height,也就是offset 0x12~0x15是width, 看到的是20 00 00 00,也就是0x00000020個pixel,0x16~0x19是height,看到也是20 00 00 00,也是0x00000020個pixel,所以它是一個32pixel*32pixel的bitmap
offset 0x1C起的2個bytes是bits per pixel也就是您所說的8 or 16 or 24bits,在這裡看到04 00,也就是0x0004=4 bit bitmap
1. 如何找pixel開始offset?
前面的file+info headers總共用了14+40=54bytes(0x00~0x35)
再來offset 0x36起就是RGBQUAD array了,一個RGBQUAD用4bytes(Blue+Green+Red+Resverve)來描述,所以4bit bitmap來說2^4=16色bit map, 16*4=64bytes就是RGBQUAD array 64bytes大小,所以0x36~0x75就是RGBQUAD array的範圍,這樣就得到pixel區的開始是0x76啦.
如果說8bit bitmap(256色bitmap)的話,256*4=1024 ,所以pixel區會從offset 14+40+1024=1078=0x436開始
如果說24bit bitmap(2^24色bitmap) 的話,msdn中提到 bmiColors member of BITMAPINFO is NULL,pixel區會直接從14+40=54=0x36開始.
16bit 和 32 bit bitmap的話msdn中也是說 bmiColors member of BITMAPINFO is NULL,但是這兩種我未曾確認過,也沒使用過,因為最常看到的就是1,4,8,24bit的bitmap,16和32bit只有您這種比較專業才可能用的到.
2. pixel中bytes佈局差別? (僅就未壓縮bitmap而言)
1bit bitmap: 1byte表示8個pixel
4bit bitmap: 1byte表示2個pixel
8bit bitmap: 1byte表示1個pixel
16bit bitmap: 1WORD表示1個pixel
24bit bittmap: 3bytes表示1個pixel
32bit bitmap: 1 DWORD表示1個pixel
所知有限,大概就是這樣
2006-04-24 22:07:31 · answer #1 · answered by chan 5 · 0⤊ 0⤋