2016-12-30 189 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