2016-12-30 52 views
-1

我正在尝试创建一个bmp文件。该文件已创建,我可以打开它,但它说,该文件已损坏,无法正常打开。下面是我的文件保存:.BMP文件无法打开

void createBMP(char* pixelData, long xRes, long yRes){ 
BITMAPFILEHEADER fheader; 
BITMAPINFOHEADER iheader; 
COLORREF_RGB rgb; 

//file header werte setzen 
fheader.bfType = 0x4D42; 
fheader.bfSize = sizeof(BITMAPFILEHEADER); 
fheader.bfReserved1 =0; 
fheader.bfReserved2=0; 
fheader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 

//info header werte setzen 
iheader.biSize = sizeof(BITMAPINFOHEADER); 
iheader.biWidth = xRes; 
iheader.biHeight = yRes; 
iheader.biPlanes = 1; 
//farbtiefe 
iheader.biBitCount = 24; 
iheader.biCompression = 0; 
iheader.biSizeImage = 0; 
iheader.biXPelsPerMeter = 0; 
iheader.biYPelsPerMeter = 0; 
//anzahl der eintraege der farbtabelle 
iheader.biClrUsed = 0; 
iheader.biClrImportant = 0; 

//rgbfarbwerte setzen 
rgb.cRed = 0; 
rgb.cGreen = 0; 
rgb.cBlue = 0; 

printf("\nwriting Image-File"); 

FILE *f; 


f = fopen("testASP.bmp", "wb"); 


if(f == NULL){ 
    freopen("testASP.bmp", "wb", f); 
    // printf("Fehler beim Laden des Files"); 
    // return; 
} 

printf("\nPath: %S\n"); 

fwrite(&fheader, sizeof(BITMAPFILEHEADER),1,f); 
fwrite(&iheader, sizeof(BITMAPINFOHEADER),1,f); 

int i,j; 

for(i=0;i<xRes; i++){ 
    for(j=0;j<yRes;j++){ 
     fwrite(&rgb, sizeof(COLORREF_RGB),1,f); 
    } 
} 

fclose(f); 


printf("Bild wurde gespeichert\n"); 

我notsure什么我做错了双重检查的价值观,但似乎无法找到我的错误。帮助将不胜感激。由于

根据要求添加结构:

typedef unsigned int UINT; 
typedef unsigned long DWORD; 
typedef long int LONG; 
typedef unsigned short WORD; 
typedef unsigned char BYTE; 


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; 

typedef struct COLORREF_RGB 
{ 
    BYTE cRed; 
    BYTE cGreen; 
    BYTE cBlue; 
}COLORREF_RGB; 
+1

什么是这背后的想法:'如果(F == NULL){ freopen函数( “testASP.bmp”,“wb”,f); ......对我来说这没有意义。 – alk

+0

你使用什么样的图书馆? – Michas

+0

所以基本上它尝试过,但它似乎并没有这样创建一个文件,它为我创建一个文件。基本上即时检查,如果这样的文件已经存在,如果没有我创建一个。有更聪明的方法吗?我不擅长c代码 – x3lq

回答

0

以下过程创建一个黑色的BMP文件:

// WIDTHBYTES takes # of bits in a scanline and rounds up to nearest word. 
#define WIDTHBYTES(bits) (((bits) + 31)/32 * 4) 

int makeBMPfile(int xRes, int yRes) 
{ 
    BITMAPFILEHEADER fheader = {0}; 
    BITMAPINFOHEADER iheader = {0}; 
    COLORREF_RGB rgb = {0,0,0}; 
    FILE *fp; 
    int i,j, padbytes; 

    iheader.biSize  = sizeof (BITMAPINFOHEADER); 
    iheader.biWidth  = xRes; 
    iheader.biHeight = yRes; 
    iheader.biPlanes = 1; 
    iheader.biBitCount = 24; 
    iheader.biSizeImage= WIDTHBYTES(xRes*24) * yRes; 
    padbytes= WIDTHBYTES(xRes*24) - (xRes*24/8); 

    fheader.bfType = 0x4D42; 
    fheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + 0/*no palette for 24 bits color*/; 
    fheader.bfSize = fheader.bfOffBits + iheader.biSizeImage; 

    if ((fp = fopen("testASP.bmp", "wb"))==NULL) return(0); 

    fwrite(&fheader, sizeof(BITMAPFILEHEADER),1,fp); 
    fwrite(&iheader, sizeof(BITMAPINFOHEADER),1,fp); 

    for(i=0;i<yRes; i++){ 
     for(j=0;j<xRes;j++){ 
      fwrite(&rgb, sizeof(COLORREF_RGB),1,fp); 
     } 
     if (padbytes) fwrite(&rgb, padbytes,1,fp); 
    } 
    fclose(fp); 
    return(1); 
} 
+0

so:fheader.bfSize = sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+ 4 * * XRES Y残余物;和我的fheader.bfOffBits = sizeof(BITMAPFILEHEADER);已经dleted的printf(...)没想到,这是如此巨大的交易,如果我把它留在 – x3lq

+0

我用完整的程序替换我的解决方案,以创建一个黑色的BMP文件。 –

+0

哇,非常感谢;) – x3lq