2012-08-01 89 views
0

我正在嘗試創建.bmp文件並且無法識別文件。我究竟做錯了什麼?我的代碼在嘗試創建BMP文件時失敗

#define ImageWidgh 1920 
#define ImageHeight 1080 
#define fileSize ImageWidgh*ImageHeight*3+54 

struct BMPH 
{ 
    short Signature; 
    long int FileSize,reserved,DataOffest; 
}BMPH; 
struct BMPIH 
{ 
    long int Size,Width,Height; 
    short Planes,BitCount; 
    long int Compression,ImageSize,XpixelsPerM,YpixelsPerM,ColorsUsed,ColorImportant; 
}BMPIH; 
struct BMPCT 
{ 
    unsigned char Red,Green,Blue; 
}BMPCT; 
BMPH *getBMPH() 
{ 
    BMPH New; 
    New.Signature='BM'; 
    New.FileSize=fileSize; 
    New.reserved=0; 
    New.DataOffest=54; 
    return &New; 
} 
BMPIH *getBMPIH() 
{ 
    BMPIH New; 
    New.Size=40; 
    New.Width=ImageWidgh; 
    New.Height=ImageHeight; 
    New.Planes=1; 
    New.BitCount=24; 
    New.Compression=0; 
    New.ImageSize=0; 
    New.XpixelsPerM=0; 
    New.YpixelsPerM=0; 
    New.ColorsUsed=0; 
    New.ColorImportant=0; 
    return &New; 
} 
BMPCT Pixels [ImageWidgh][ImageHeight]; 
void writeFile() 
{ 
    FILE *file; 
    file=fopen("D://test.bmp","wb"); 
    fwrite(getBMPH() ,sizeof(BMPH) ,1,file); 
    fwrite(getBMPIH(),sizeof(BMPIH),1,file); 
    fwrite(&Pixels ,ImageWidgh*ImageHeight*3,1,file); 
    fclose(file); 
} 
+1

可能填充的問題?不是通過填充數據結構來優化編譯器嗎?你是否在十六進制編輯器中檢查了文件,字段的大小是否正確? – 2012-08-01 22:47:20

回答

5

一個經典的錯誤是:你正在返回一個指向局部變量的指針,一旦你離開函數就會被銷燬。指針最終指向亂碼或更糟。

讓函數返回完整結構而不是指針,或者將指針傳入函數而不是在其中創建變量。

+0

或者使用C++代替C :) – 2012-08-01 22:55:17

+0

@MihaiTodor C++不會阻止你在腳下射擊自己。 – Neil 2012-08-01 23:12:11

+0

同意這一點,但我仍然覺得有趣的是看到簡單的C代碼標記爲C++ :) – 2012-08-01 23:14:27

0

這看起來不正確的對我說:

New.Signature='BM'; 

當然,你想:

New.Signature = *(short*)"BM"; 
+0

我改變它爲New.Signature = *(short *)「BM」;並閱讀該文件。謝謝大家的幫助! – user1569875 2012-08-01 23:13:26

+0

你從未聽說過多字符文字? http://stackoverflow.com/questions/3960954/c-multicharacter-literal。儘管您可能需要使用「MB」來解決字節順序問題。 – 2012-08-01 23:18:10

+0

@MarkRansom不,實際上。我似乎已經通過了20年的編程而不需要它們!每天學習一些新東西......但是,這個鏈接似乎是說它們的處理是針對特定實現的,所以我不想把它當作一個「新玩具」,並且不要將多字符文字灑在我的所有內容中碼。 – paddy 2012-08-01 23:34:10

相關問題