作者cometstar ()
看板C_and_CPP
標題[問題] bmp檔讀取與寫入
時間Wed Jul 1 22:33:05 2009
有個小問題想請教各位前輩,
今天花了點時間寫了個小程式,想用它來批次合成bmp圖檔,
被合成的圖檔有其特性,兩張圖是同尺寸同深度,
b.bmp有固定底色,而我希望把b.bmp的這個底色濾掉,
其餘前景的部份則貼到a.bmp上去;
目前的做法是分別用fread讀入兩張圖檔後,
再以for迴圈一次讀入一個pixel的RGB值,判別是否和底色相同,
是的話擋掉,不是的話就貼到a.bmp上面去;
初步測試的結果雖然大致上OK,但卻出現了一個小狀況:
假設b.bmp中有一段是
301A5B 0D3057 FF0000 FF0000 ....
px X px X+1 px X+2 px X+3
FF0000的部份是藍色底色,以這段資料來看的話,
應該是301A5B和0D3057要被寫到a.bmp去而FF0000不要,
但打開完成後的a.bmp卻會變成像下面這樣:
301A5B 0D30FF 0000FF 0000FF ....
不知道是在讀取還是寫入時出了錯,中間少掉了1byte,
結果後面全部跟著錯掉,藍底色被判別成紅色全部寫到a.bmp去,
問題是這情況並非100%發生,有的圖一切正常,有的則會出現這問題,
而我實在找不到那1byte到底為什麼會人間蒸發...囧
不曉得有沒有哪位碰過類似的情況呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.65.41
1F:→ akasan:沒開fopen參數沒加b? 07/01 22:57
2F:→ jaw109:處理BMP要考慮padding 07/01 23:06
3F:推 VictorTom:推樓上說的, BMP要注意padding問題:) 07/01 23:26
4F:→ cometstar:讀檔沒加b,寫入有...明天再試試看讀檔也加b 07/01 23:55
5F:→ cometstar:padding的話,雖然我真的沒考慮到,但ok和ng的圖都同大小 07/01 23:57
6F:→ cometstar:也都符合4x的倍數耶... @.@" 07/01 23:57
7F:→ qazq:read/write 都要加 b 才可以喔! 07/02 00:02
8F:→ typeotoco:讀檔沒加B你讀的出來真的是運氣 @@" 07/02 00:03
9F:推 zlw:說不定不是用Windows,加不加b都沒差 07/02 00:05
10F:→ typeotoco:你 code 沒出來沒辦法解bug, 找找記憶體配置的地方 07/02 00:09
早上看了一下,fread a.bmp有加b,b.bmp則沒有,
兩個都加之後就沒問題了...待會也處理一下padding的機制好了,
謝謝各位前輩的指教 <(_ _)>
※ 編輯: cometstar 來自: 61.219.70.229 (07/02 10:29)