VC透过fwrite生成bmp文件无法打开
VC通过fwrite生成bmp文件无法打开
写了一个可以根据Data数组中的数据构造bmp的函数,结果bmp文件无法打开
代码如下,W为图像宽度(像素单位),H为图像高度(像素宽度),string为存储路径,Data为数据数组。
代码如下:
CMyDib::CMyDib(int W, int H,LPCTSTR string,unsigned char *Data)
{
FILE *fp;
// bool ret;
UINT nPad;
BYTE Pad[4];
RGBQUAD Quad[256];
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
int count;
//设定BITMAPFILEHEADER
memset(&bfh, 0, sizeof(bfh));
bfh.bfType = 'BM';
bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 + ((W*8+31)/32*4)*H;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*256;
//设定BITMAPINFOHEADER
memset(&bih, 0, sizeof(bih));
bih.biSize = sizeof(bih);
bih.biWidth = W;
bih.biHeight = H;
bih.biPlanes = 1; //必须为1
bih.biBitCount = 8;
bih.biCompression = BI_RGB;
bih.biSizeImage = ((W*8+31)/32*4)*H;
//设定调色盘数据Quad
for(int n=0; n<256; n++)
{
Quad[n].rgbBlue = n;
Quad[n].rgbGreen = n;
Quad[n].rgbRed = n;
Quad[n].rgbReserved = 0;
}
//下面写数据到BITMAP文件
fp = fopen(string, "wd");
// if (fp==NULL) return false;
count = fwrite(&bfh, 1, sizeof(bfh), fp);
count = fwrite(&bih, 1, sizeof(bih), fp);
count = fwrite(Quad, 1, sizeof(Quad), fp);
//下面写入数据部分,注意,bmp的数据上下是颠倒的
Data = Data + W*(H-1); //因为上下颠倒,所以需要将Data指向最后
//一行,以后再对Data进行减操作。
nPad = ((W*8+31)/32*4) - W; //因为bmp每行的数据为4的倍数,所以
//需要在每行后面补0,nPad为补的字节数
memset(Pad, 0, sizeof(Pad));
for(int h=H-1; h>=0; h--)
{
count = fwrite(Data, 1, W, fp);
count = fwrite(Pad, 1, nPad, fp);
Data = Data - W; ////因为上下颠倒,Data是倒退着写入文件
}
// ret = ferror()==0;
fclose(fp);
}
------解决方案--------------------
对比一下正确的文件跟写入的文件,估计还是写入的数据有问题
------解决方案--------------------
你用winhex,或者ultraedit打开看下,两个文件有没有什么不一样,就是一个图片,一个你写的文件
写了一个可以根据Data数组中的数据构造bmp的函数,结果bmp文件无法打开
代码如下,W为图像宽度(像素单位),H为图像高度(像素宽度),string为存储路径,Data为数据数组。
代码如下:
CMyDib::CMyDib(int W, int H,LPCTSTR string,unsigned char *Data)
{
FILE *fp;
// bool ret;
UINT nPad;
BYTE Pad[4];
RGBQUAD Quad[256];
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
int count;
//设定BITMAPFILEHEADER
memset(&bfh, 0, sizeof(bfh));
bfh.bfType = 'BM';
bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256 + ((W*8+31)/32*4)*H;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*256;
//设定BITMAPINFOHEADER
memset(&bih, 0, sizeof(bih));
bih.biSize = sizeof(bih);
bih.biWidth = W;
bih.biHeight = H;
bih.biPlanes = 1; //必须为1
bih.biBitCount = 8;
bih.biCompression = BI_RGB;
bih.biSizeImage = ((W*8+31)/32*4)*H;
//设定调色盘数据Quad
for(int n=0; n<256; n++)
{
Quad[n].rgbBlue = n;
Quad[n].rgbGreen = n;
Quad[n].rgbRed = n;
Quad[n].rgbReserved = 0;
}
//下面写数据到BITMAP文件
fp = fopen(string, "wd");
// if (fp==NULL) return false;
count = fwrite(&bfh, 1, sizeof(bfh), fp);
count = fwrite(&bih, 1, sizeof(bih), fp);
count = fwrite(Quad, 1, sizeof(Quad), fp);
//下面写入数据部分,注意,bmp的数据上下是颠倒的
Data = Data + W*(H-1); //因为上下颠倒,所以需要将Data指向最后
//一行,以后再对Data进行减操作。
nPad = ((W*8+31)/32*4) - W; //因为bmp每行的数据为4的倍数,所以
//需要在每行后面补0,nPad为补的字节数
memset(Pad, 0, sizeof(Pad));
for(int h=H-1; h>=0; h--)
{
count = fwrite(Data, 1, W, fp);
count = fwrite(Pad, 1, nPad, fp);
Data = Data - W; ////因为上下颠倒,Data是倒退着写入文件
}
// ret = ferror()==0;
fclose(fp);
}
------解决方案--------------------
对比一下正确的文件跟写入的文件,估计还是写入的数据有问题
------解决方案--------------------
你用winhex,或者ultraedit打开看下,两个文件有没有什么不一样,就是一个图片,一个你写的文件