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头文件的方法么 展开
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头文件的方法么 展开
1个回答
展开全部
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;
}
这是我测试用的,正常输出的例子
把你的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;
}
这是我测试用的,正常输出的例子
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询