VC下关于BMP文件写入的问题

FILE*fp=NULL;unsignedcharpalatte[1024];BITMAPFILEHEADERbf;BITMAPINFOHEADERbi;intlineB... FILE *fp = NULL;
unsigned char palatte[1024];
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
int lineBytes = 0;
int i;

lineBytes = (int)WIDTHBYTES(Width);

//构造bmp文件头信息
bf.bfType=19778;
bf.bfSize = lineBytes*Height+1078;
bf.bfReserved1=0;
bf.bfReserved2=0;
bf.bfOffBits=1078;
bi.biSize=40;
bi.biWidth = Width;
bi.biHeight = Height;
bi.biPlanes=1;
bi.biBitCount=8;
bi.biCompression=0;
bi.biSizeImage= lineBytes*Height;
bi.biXPelsPerMeter=0;
bi.biYPelsPerMeter=0;
bi.biClrUsed=256;

bi.biClrImportant=0;
//构造调色板数据
for(i=0;i<256;i++){
palatte[i*4]=(unsigned char)i;
palatte[i*4+1]=(unsigned char)i;
palatte[i*4+2]=(unsigned char)i;
palatte[i*4+3]=0;
}
// 创建文件
fp = fopen(lpszFileName, "wb");
if(fp == NULL)
{
return 1;
}
// 写文件头
fwrite((char *)&bf,sizeof(BITMAPFILEHEADER), 1, fp);
// 写BMP图像信息头
fwrite((char *)&bi, sizeof(BITMAPINFOHEADER), 1, fp);
// 写调色板
fwrite((char *)palatte, sizeof(palatte), 1, fp);
// 按行写,每行写WIDTHBYTES(Width)个字节
for(i = 0; i < Height; i++)
fwrite((char *)(lpBitmap+i*Width), lineBytes, 1, fp);

fclose(fp);

return 0;

这是一个写入函数,高人指点
没有不调用WINDOWS头文件的方法么
展开
 我来答
gtornado0
2010-06-11 · TA获得超过184个赞
知道小有建树答主
回答量:152
采纳率:0%
帮助的人:113万
展开全部
lineBytes = (int)WIDTHBYTES(Width*8); <<少X了颜色位数
把你的WIDTHBYTES定义改成
#define WIDTHBYTES(i)((i+31)/32*4) <<<---------
如果这样还不对,就是程序其他部分有问题了

#include <stdio.h>
#include <windows.h>

#define WIDTHBYTES(i)((i+31)/32*4)

int main( void )
{

int Width = 200, Height = 200;
char* lpszFileName = "d:\\test001.bmp";

FILE *fp = NULL;
unsigned char palatte[1024];
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
int lineBytes = 0;
int i;

char lpBitmap[ 200 ];

memset( lpBitmap, 128, 200 );

lineBytes = (int)WIDTHBYTES(Width*8);

//构造bmp文件头信息
bf.bfType=19778;
bf.bfSize = lineBytes*Height+1078;
bf.bfReserved1=0;
bf.bfReserved2=0;
bf.bfOffBits=1078;
bi.biSize=40;
bi.biWidth = Width;
bi.biHeight = Height;
bi.biPlanes=1;
bi.biBitCount=8;
bi.biCompression=0;
bi.biSizeImage= lineBytes*Height;
bi.biXPelsPerMeter=0;
bi.biYPelsPerMeter=0;
bi.biClrUsed=256;

bi.biClrImportant=0;
//构造调色板数据
for(i=0;i<256;i++){
palatte[i*4]=(unsigned char)i;
palatte[i*4+1]=(unsigned char)i;
palatte[i*4+2]=(unsigned char)i;
palatte[i*4+3]=0;
}
// 创建文件
fp = fopen(lpszFileName, "wb");
if(fp == NULL)
{
return 1;
}
// 写文件头
fwrite((char *)&bf,sizeof(BITMAPFILEHEADER), 1, fp);
// 写BMP图像信息头
fwrite((char *)&bi, sizeof(BITMAPINFOHEADER), 1, fp);
// 写调色板
fwrite((char *)palatte, sizeof(palatte), 1, fp);
// 按行写,每行写WIDTHBYTES(Width)个字节
for(i = 0; i < Height; i++)
fwrite((char *)(lpBitmap), lineBytes, 1, fp);

fclose(fp);

return 0;
}
这是我测试用的,正常输出的例子
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式