作者PkmX (阿貓)
看板C_and_CPP
標題Re: [問題] 新手讀bmp 的每點rgb
時間Fri Aug 5 21:43:36 2011
我就直接丟一個可以跑的範例出來吧:
http://codepad.org/oGe8oHJj
只能讀raw b8g8r8的bitmap image,重點在load_bmp()這個function,
然後用骨灰級的opengl把讀進來的image秀出來,這部份我就不多作解釋了
load_bmp()這個function一開始就是開檔案然後把header讀進來,
bmp_file_header和bmp_info_header這兩個struct我
偷懶從wikipedia上copy過來的,
可以對照著用,讀完以後就把圖片的寬度(width)和長度(height)抓出來,
然後檢查其值是否為正值,bitmap圖檔是從左下往右上儲存的(先往右再往上),
如果高度是負值的話則是從左上往右下,等於圖片上下顛倒,
然後檢查該圖片是否為24-bit raw rgb圖檔,這一種的讀取可說是最簡單的
接下來重點來了,24-bit rgb的bitmap image實際上儲存的方式是,先b再g再r,
你可以想像一張5x3 (width x height)的bitmap的pixel data會長這樣:
bgrbgrbgrbgrbgrx
bgrbgrbgrbgrbgrx
bgrbgrbgrbgrbgrx
一個pixel是3個bytes,但是每一行都必須有4-byte alignment,
所以每行最後要補1 byte讓一行有16個bytes,也就是必須為4的倍數,
觀察一下就會發現padding的bytes數其實就是width%4,
舉例圖片width是35的話,一行的pixel的資料佔35*3=105 bytes,
但需要補3個bytes的padding,讓一行變成105+3=108,
而3 bytes的padding剛好就是35%4=3,
把握這個原則後讀取24-bit raw bitmap image就不是什麼大問題了,
如果還是不行的話再發問吧
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.208.243
推 ericinttu:alignment很重要, 要注意. 08/05 21:49
推 pigcat1315:恩 感恩~ 08/05 22:06
推 tropical72:佛心 08/05 22:25
推 angleevil:欣賞兩位好人 08/05 22:26
推 pigcat1315:我用file.read(char*)&color,3);為何這樣第一個點 08/05 23:14
→ pigcat1315::( 怎會都沒東西出現呢 08/05 23:16
推 pigcat1315:感謝成功了^^ 08/06 00:56
→ Favonia:推一樓。其實還有 endienness... 08/06 03:13