.BMP文件无法打开
问题描述:
我正在尝试创建一个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;
答
以下过程创建一个黑色的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);
}
什么是这背后的想法:'如果(F == NULL){ freopen函数( “testASP.bmp”,“wb”,f); ......对我来说这没有意义。 – alk
你使用什么样的图书馆? – Michas
所以基本上它尝试过,但它似乎并没有这样创建一个文件,它为我创建一个文件。基本上即时检查,如果这样的文件已经存在,如果没有我创建一个。有更聪明的方法吗?我不擅长c代码 – x3lq