Re: [問題] 新手讀bmp 的每點rgb

看板C_and_CPP作者 (阿貓)時間14年前 (2011/08/05 21:43), 編輯推噓6(602)
留言8則, 5人參與, 最新討論串3/3 (看更多)
我就直接丟一個可以跑的範例出來吧: 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

08/05 21:49, , 1F
alignment很重要, 要注意.
08/05 21:49, 1F

08/05 22:06, , 2F
恩 感恩~
08/05 22:06, 2F

08/05 22:25, , 3F
佛心
08/05 22:25, 3F

08/05 22:26, , 4F
欣賞兩位好人
08/05 22:26, 4F

08/05 23:14, , 5F
我用file.read(char*)&color,3);為何這樣第一個點
08/05 23:14, 5F

08/05 23:16, , 6F
:( 怎會都沒東西出現呢
08/05 23:16, 6F

08/06 00:56, , 7F
感謝成功了^^
08/06 00:56, 7F

08/06 03:13, , 8F
推一樓。其實還有 endienness...
08/06 03:13, 8F
文章代碼(AID): #1EE_EBaW (C_and_CPP)
文章代碼(AID): #1EE_EBaW (C_and_CPP)