[問題] bmp的資料寫出

看板C_and_CPP (C/C++)作者 (kkk1225)時間16年前 (2009/11/23 12:15), 編輯推噓10(10022)
留言32則, 4人參與, 最新討論串1/1
請問file size的9-13註解和24-28註解 不太懂意思 1. // write to new bmp 2. fp_t = fopen(fname_t, "wb"); 3. if (fp_t == NULL) 4. { 5. printf("fopen fname_t error\n"); 6. return -1; 7. } 8. // file size 9. file_size = width * height * 3 + rgb_raw_data_offset; 10. header[2] = (unsigned char)(file_size & 0x000000ff); 11. header[3] = (file_size >> 8) & 0x000000ff; 12. header[4] = (file_size >> 16) & 0x000000ff; 13. header[5] = (file_size >> 24) & 0x000000ff; 14. // width 15. header[18] = width & 0x000000ff; 16. header[19] = (width >> 8) & 0x000000ff; 17. header[20] = (width >> 16) & 0x000000ff; 18. header[21] = (width >> 24) & 0x000000ff; 19. // height 20. header[22] = height &0x000000ff; 21. header[23] = (height >> 8) & 0x000000ff; 22. header[24] = (height >> 16) & 0x000000ff; 23. header[25] = (height >> 24) & 0x000000ff; 24. // write header 25. fwrite(header, sizeof(unsigned char), rgb_raw_data_offset, fp_t); 26. // write image 27. fwrite(image_t, sizeof(unsigned char), (size_t)(long)width * height * 3, 28. fp_t); 29. fclose(fp_t); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.120.32.178

11/23 12:34, , 1F

11/23 12:34, , 2F
去把格式的spec看一看你才知道它在寫什麼資料進檔案:)
11/23 12:34, 2F

11/23 12:51, , 3F
請問為什麼header後面要做(>>8)&0x000000ff在幹麻的
11/23 12:51, 3F

11/23 12:55, , 4F
明顯是在處理 endian 不同的情況
11/23 12:55, 4F

11/23 12:56, , 5F
這是很不好的 code,看來寫的人不斷地 copy-paste
11/23 12:56, 5F

11/23 12:57, , 6F
什麼是endian
11/23 12:57, 6F


11/23 13:32, , 8F
小弟我也覺得10~13寫法有點鳥, 而且好像處理不了endian
11/23 13:32, 8F

11/23 13:33, , 9F
不同的情況啊?_? 話說, 所以同一張BMP在endian不同的系
11/23 13:33, 9F

11/23 13:33, , 10F
統裡解讀出來會不一樣喔?_? 指raw binary一模一樣的情況
11/23 13:33, 10F

11/23 14:36, , 11F
應該說 這段code只能在little endian的機器上跑吧
11/23 14:36, 11F

11/23 14:37, , 12F
對~~小弟就是這個意思XD 只是同一個BMP檔會因為endian
11/23 14:37, 12F

11/23 14:37, , 13F
問題導致在Big End的時候就無法正常抓到size嗎?? 還是
11/23 14:37, 13F

11/23 14:38, , 14F
這種case某一方要牽就對方?_?
11/23 14:38, 14F

11/23 14:38, , 15F
手上沒有Big End的平台可以玩, 看來只好遇到了再去慢慢
11/23 14:38, 15F

11/23 14:38, , 16F
查資料, 沒遇到就........XDDD
11/23 14:38, 16F

11/23 14:53, , 18F
『What does that Mean for Us?』往下看一分鐘
11/23 14:53, 18F

11/23 14:57, , 19F
先謝謝221大提供的資料, 大概下班回家才有空看吧....Orz
11/23 14:57, 19F

11/23 14:58, , 20F
就先跳到您說的那段, 看來是單一endian的, 所以BMP在
11/23 14:58, 20F

11/23 14:59, , 21F
Big End要牽就Lit End; 相對的有其他格式相反. 那這樣
11/23 14:59, 21F

11/23 14:59, , 22F
看來那段sample code這樣處理Lit End反而是正確的說@_@"
11/23 14:59, 22F

11/23 15:22, , 23F
http://codepad.org/va40P6qm 他就跟我這樣都是寫死
11/23 15:22, 23F

11/23 15:22, , 24F
程式碼必須運行於 little-endian 的機器,他想要做的
11/23 15:22, 24F

11/23 15:23, , 25F
『BMP影像另存新檔』動作才會正確
11/23 15:23, 25F

11/23 15:25, , 26F
當然fwrite部份,我都寫4byte了,也是寫死在32位元機器
11/23 15:25, 26F

11/23 15:34, , 27F
啊, 問題不在header[2~5], 在那個 file_size>> 是嗎Orz
11/23 15:34, 27F

11/23 18:43, , 28F
是的,就彈性比較低。
11/23 18:43, 28F

11/23 18:43, , 29F
不過 header[] 陣列也是多此一舉,因為只是把資料從記憶
11/23 18:43, 29F

11/23 18:44, , 30F
體的一端比如 int file_size 搬到另一端 header[] 而已
11/23 18:44, 30F

11/24 16:44, , 31F
我的程式還有前半段,上面的程式是後半段而已
11/24 16:44, 31F

11/24 16:47, , 32F
非常謝謝各位的回覆
11/24 16:47, 32F
文章代碼(AID): #1B2WnsXt (C_and_CPP)
文章代碼(AID): #1B2WnsXt (C_and_CPP)