24位BMP位图的保存

jtacm123 jtacm123 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我再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();

}
...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
jtacm123
图形处理/算法 19,463 成员 50,678 内容