[問題] 讀取 bmp 的表頭。
struct BMP_HEADER // BMP檔檔頭
{
short Check_Mark; /* 固定為'BM' */
long File_Size; /* 影像檔大小 */
long Reserved; /* 保留 */
long Image_Offset; /* 影像資料在檔案中的位置 */
long Header_Size; /* 檔頭大小,固定40表MS-Windows,12表OS/2 */
long Image_DX; /* 影像寬度 */
long Image_DY; /* 影像高度 */
short Bit_Planes; /* 色彩平面數,固定為1 */
short Bit_Count; /* 每點位元數, 1=黑白, 4=16色, 8=256色, 24=全彩 */
long Compression; /* 壓縮方式, 0=不壓縮, 1=RLE8(256色), 2=RLE4(16色) */
long Image_Size; /* 影像資料大小 */
long XDPM; /* 水平解析度(每公尺) */
long YDPM; /* 垂直解析度(每公尺) */
long Color_Used; /* 實際使用的顏色數,0表由Bit_Count決定 */
long Color_Important; /* 重要的色彩數目,0表都重要 */
};
用手算的結果,這個結構的大小為 54
但是因為編譯器會對記憶體配置最佳化,所以 sizeof() 會變成 56
這樣,問題就來了....
當我 fread(&bmp, sizeof(BMP_HEADER), 1, fp);
印出來的結果是錯誤的。
==============================================================================
Check_Mark(固定為'BM'): 19778
File_Size(影像檔大小): 10
Reserved(保留): 3538944
Image_Offset(影像資料在檔案中的位置): 2621440
==============================================================================
如果一個一個讀...
fread(&bmp.Check_Mark, 2, 1, fp);
fread(&bmp.File_Size, 4, 1, fp);
fread(&bmp.Reserved, 4, 1, fp);
fread(&bmp.Image_Offset, 4, 1, fp);
結果就是正確的....
==============================================================================
Check_Mark(固定為'BM'): 19778
File_Size(影像檔大小): 720054
Reserved(保留): 0
Image_Offset(影像資料在檔案中的位置): 54
==============================================================================
請問有什麼方法可以解決呢?
之前有板友推文說
推
,
我試過了,還是不可以....>"<
我是用 VC 不是 gcc 所以也不能用板友說的 在結構宣告後面加
__attribute__((__packed__))
請問,還有什麼方法可以解決呢?除了一個欄位一個欄位讀。
謝謝大家! :)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.163.161.135
推
61.228.216.130 07/05, , 1F
61.228.216.130 07/05, 1F
推
211.75.159.136 07/05, , 2F
211.75.159.136 07/05, 2F
推
61.228.216.130 07/05, , 3F
61.228.216.130 07/05, 3F
→
61.228.216.130 07/05, , 4F
61.228.216.130 07/05, 4F
推
61.230.216.96 07/05, , 5F
61.230.216.96 07/05, 5F
→
61.230.216.96 07/05, , 6F
61.230.216.96 07/05, 6F
推
218.163.161.135 07/05, , 7F
218.163.161.135 07/05, 7F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
-4
30