MFC 如何创建空白BMP文件?

ppaittt 2014-05-07 09:24:47
要在MFC中创建一副空白位图,怎么实现。要直接用向文件内写数据的办法,我试了好久没成功,大家看一下下面的程序有何问题

FILE *pFile=fopen("1.bmp","wb");
unsigned char *pBmpBuf;//位图数据
RGBQUAD *pColorTable;//调色板数据

for(int i=0;i<12800;i++)
pBmpBuf[i]=0xFF;//建立一320*320像素的位图,位深为1,则共需12800字节来存储像素数据

BITMAPFILEHEADER bmfHdr; //文件头
//位图文件头结构
BITMAPINFOHEADER bi;//信息头

pColorTable[0].rgbBlue=0;//颜色表数据
pColorTable[0].rgbGreen=0;
pColorTable[0].rgbGreen=0;
pColorTable[0].rgbReserved=0;
pColorTable[1].rgbBlue=255;
pColorTable[1].rgbGreen=255;
pColorTable[1].rgbGreen=255;
pColorTable[1].rgbReserved=0;

bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = 320;
bi.biHeight =320;
bi.biPlanes = 1;
bi.biBitCount = 1;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
bmfHdr.bfType = 0x4D42; // "BM"
//dwDIBSize=12826;
bmfHdr.bfSize = 12862;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = 62;

fwrite(&bmfHdr, sizeof(BITMAPFILEHEADER),1, pFile);
fwrite(&bi, sizeof(BITMAPINFOHEADER),1, pFile);
fwrite(pColorTable, sizeof(RGBQUAD),2, pFile);
fwrite(pBmpBuf, 12800, 1, pFile);
fclose(pFile);
...全文
305 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
relaxisland 2014-05-08
  • 打赏
  • 举报
回复
unsigned char *pBmpBuf;//位图数据 RGBQUAD *pColorTable;//调色板数据 -------------------------------- 基本语法问题, 这2个都没分配内存,怎么可以往里写数据? 动态分配,或者 unsigned char pBmpBuf[320*320*n];
schlafenhamster 2014-05-08
  • 打赏
  • 举报
回复
""可不可以这样理解? 必须的 !
ppaittt 2014-05-08
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
int a=sizeof(pBmpBuf); 指针的 size 可不就是 4 吗。 直接 int a=128;
这个懂了,指针的大小是4byte,指针指向的内容是1byte,可不可以这样理解? 你这一说 我突然对我上面的问题也有些明白了,谢谢啊,问题解决了
schlafenhamster 2014-05-08
  • 打赏
  • 举报
回复
int a=sizeof(pBmpBuf); 指针的 size 可不就是 4 吗。 直接 int a=128;
ppaittt 2014-05-08
  • 打赏
  • 举报
回复
引用 1 楼 relaxisland 的回复:
unsigned char *pBmpBuf;//位图数据 RGBQUAD *pColorTable;//调色板数据 -------------------------------- 基本语法问题, 这2个都没分配内存,怎么可以往里写数据? 动态分配,或者 unsigned char pBmpBuf[320*320*n];
貌似上面有个地方写错了,最后输出的时候 CString str; str.Format("x=%d",a); AfxMessageBox(str); 这脑子 哎
ppaittt 2014-05-08
  • 打赏
  • 举报
回复
非常感谢你的回答,这个问题昨天自己也想到了 但是改过之后还是有问题,我多啰嗦几句啊,望海涵。假设我还是通过以上思路建立位图文件,目标位图32*32像素,位深1。根据位图文件的结构,文件头14字节,信息头40字节,位深为一则颜色表有两种颜色,共8字节,所以前面三部分一共62字节。因为是一位的位图所以一个BIT表示一个像素,则实际像素数据共有32/8*32=128字节数据。然后我向文件里面写数据,前三部分都没有问题,最后再写实际数据的时候实际生成的bmp文件总是会多出很多数据,让我很郁闷。
unsigned char *pBmpBuf;定义实际数据存储
pBmpBuf=new unsigned char[128];开辟128字节的数组
for(int i=0;i<128;i++)
pBmpBuf[i]=0xFF;向数组内写数据
fwrite(pBmpBuf, sizeof(pBmpBuf), 128, pFile);//将数组数据写入文件
实际得到的数据是这样的,其中红色大框里面是我实际想得到的数据,红框外面的数据是莫名其妙多出来的,实在不解啊。
再问一个问题,sizeof返回的不是占用内存的字节数吗,为什么我用下面的语句输出来是4呢?
unsigned char *pBmpBuf;
pBmpBuf=new unsigned char[128];
int a=sizeof(pBmpBuf);
AfxMessageBox("x=%d",a);

小白过于啰嗦 还望回答

引用 1 楼 relaxisland 的回复:
unsigned char *pBmpBuf;//位图数据
RGBQUAD *pColorTable;//调色板数据
--------------------------------
基本语法问题, 这2个都没分配内存,怎么可以往里写数据?

动态分配,或者
unsigned char pBmpBuf[320*320*n];

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧