2011-08-02 86 views
3

我正在使用下面的代碼將一個XImage寫入文件「bitmap0.bmp」,但是當我在Fedora中用imageViewer打開新創建的文件時,它會提供「文件過早結束」錯誤,不顯示任何東西。任何人都可以請在下面的代碼中指出問題?將XImage寫入.bmp文件C

typedef struct tagBITMAPFILEHEADER { 
WORD bfType; 
DWORD bfSize; 
WORD bfReserved1; 
WORD bfReserved2; 
DWORD bfOffBits; 

} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{ 
DWORD biSize; 
LONG biWidth; 
LONG biHeight; 
WORD biPlanes; 
WORD biBitCount; 
DWORD biCompression; 
DWORD biSizeImage; 
LONG biXPelsPerMeter; 
LONG biYPelsPerMeter; 
DWORD biClrUsed; 
DWORD biClrImportant; 

} BITMAPINFOHEADER;

void saveXImageToBitmap(XImage *pImage) 
{ 
BITMAPFILEHEADER bmpFileHeader; 
BITMAPINFOHEADER bmpInfoHeader; 
FILE *fp; 
static int cnt = 0; 
int dummy; 
char filePath[255]; 
memset(&bmpFileHeader, 0, sizeof(BITMAPFILEHEADER)); 
memset(&bmpInfoHeader, 0, sizeof(BITMAPINFOHEADER)); 
bmpFileHeader.bfType = 0x4D42; 
bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pImage->width*pImage->height*4; 
bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); 
bmpFileHeader.bfReserved1 = 0; 
bmpFileHeader.bfReserved2 = 0; 

bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER); 
bmpInfoHeader.biWidth = pImage->width; 
bmpInfoHeader.biHeight = pImage->height; 
bmpInfoHeader.biPlanes = 1; 
bmpInfoHeader.biBitCount = 32; 
dummy = (pImage->width * 3) % 4; 
if((4-dummy)==4) 
    dummy=0; 
else 
    dummy=4-dummy; 
bmpInfoHeader.biSizeImage = ((pImage->width*3)+dummy)*pImage->height; 
bmpInfoHeader.biCompression = 0; 
bmpInfoHeader.biXPelsPerMeter = 0; 
bmpInfoHeader.biYPelsPerMeter = 0; 
bmpInfoHeader.biClrUsed = 0; 
bmpInfoHeader.biClrImportant = 0; 

sprintf(filePath, "bitmap%d.bmp", cnt++); 
fp = fopen(filePath,"wb"); 

if(fp == NULL) 
    return; 

fwrite(&bmpFileHeader, sizeof(bmpFileHeader), 1, fp); 
fwrite(&bmpInfoHeader, sizeof(bmpInfoHeader), 1, fp); 
fwrite(pImage->data, 4*pImage->width*pImage->height, 1, fp); 
fclose(fp); 

}

+1

爲什麼你'pImage->寬* 3'?你也確定你的結構沒有被填充(也許你需要'__attribute __((packed(1)))''? – user786653

回答

2

謝謝user786653。我檢查了我的結構。他們得到填充。我加了

#pragma pack (1) 

在結構中,現在它工作正常。 :)