24位BMP位图的保存

jtacm123 2006-12-06 12:00:14
我再ClientDC中已经绘制了图形,想以24位BMP保存下来
写了下面一段程序,可是总保存失败,打不开所保存的位图文件,
高手帮我看下
void CPainterView::OnFileSaveAs()
{

CFileDialog dlg(false);

if(dlg.DoModal()==IDOK)
{
CPainterDoc* pDoc = GetDocument();
CString name=dlg.GetPathName();
MessageBox(name);
ofstream fout(name,ios::binary);

CClientDC dc(this);
RECT r;
this->GetClientRect(&r);

int x=r.right-r.left+1;
int y=r.bottom-r.top+1;
int x1=x*3;
x1=x1%4?(x1/4+1)*4:x1;

char *data;
data=new char[x1*y];//一个CHAR型的数组
for(int i=0;i<y;i++)//先把所有的初始化为0,
{
for(int j=0;j<x1;j++)
{
data[j+i*x1]='0';
}
}


for(int i=0;i<y;i++)//取每个象素的颜色值,分别进行赋值
{
for(int j=0;j<x;j++)
{
COLORREF view=dc.GetPixel(j,y-1-i);

char red=(char)(view>>16);
char green=(char)(view>>8);
char blue=(char)view;
int k=(j+i*x)*3;
data[k]='2';
data[k+1]='255';
data[k+2]='3';
}
}


BITMAPFILEHEADER bh;
BITMAPINFOHEADER bi;

bh.bfOffBits=sizeof(bh)+sizeof(BITMAPINFOHEADER);
bh.bfReserved1=0;
bh.bfReserved2=0;
bh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+x1*y;
bh.bfType='BM';

bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=(long)x;
bi.biHeight=(long)y;
bi.biPlanes=1;
bi.biBitCount=24;
bi.biCompression=0;
bi.biSizeImage=sizeof(BITMAPFILEHEADER)+sizeof (BITMAPINFOHEADER)+x1*y;

fout.write((char*)&bh,sizeof(bh));
fout.write((char*)&bi,sizeof(bi));
fout.write(data,x1*y);
fout.close();

}
...全文
136 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kanglipeng 2006-12-06
  • 打赏
  • 举报
回复
char *data;
data=new char[x1*y];//一个CHAR型的数组
把char 类型 换成 BYTE类型试一下!
lambochan 2006-12-06
  • 打赏
  • 举报
回复
bh.bfType='BM';
改成bh.bfType=0x4d42;

19,468

社区成员

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

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