看板 C_and_CPP 關於我們 聯絡資訊
我就直接丟一個可以跑的範例出來吧: 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