在X中将XImage写入.bmp文件

我正在使用以下代码将XImage写入文件“bitmap0.bmp”但是当我在fedora中使用imageViewer打开新创建的文件时,它会出现“文件过早结束”错误并且不显示任何内容。 有谁可以请指出以下代码中的问题?

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); 

}

谢谢user786653。 我检查了我的结构。 他们被填补了。 我补充道

 #pragma pack (1) 

在结构中,现在它工作正常。 🙂