为什么我这样保存不了图片?

llsablexx 2002-08-26 01:30:55
为什么这么不行呢?这个是把自己画的图片存成bmp文件
下面这个程序不行雅,怎么搞的,我要疯了
大家帮帮忙雅
BOOL CMydibView::DIB_SaveImage(LPCTSTR lpszName)
{

CWnd *pWnd=AfxGetApp()->GetMainWnd();
CClientDC dc(pWnd);
CDC memDC;
GetClientRect(Rect);
memDC.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc,Rect.Width(),Rect.Height());
memDC.SelectObject(&bitmap);
memDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&dc,Rect.left,Rect.top,SRCCOPY);
//保存
BITMAP bmp; //
PBITMAPINFO pbmi;//
WORD cClrBits;
GetObject(bitmap,sizeof(BITMAP),(LPSTR)&bmp);
cClrBits=(WORD)(bmp.bmPlanes*bmp.bmBitsPixel);

if(cClrBits==1)
cClrBits=1;
else if(cClrBits<=4)
cClrBits=4;
else if(cClrBits<=8)
cClrBits=8;
else if(cClrBits<=16)
cClrBits=16;
else if(cClrBits<=24)
cClrBits=24;
else
cClrBits=32;

if(cClrBits==24)
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD)*cClrBits);
else
pbmi=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER));
pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth=bmp.bmWidth;
pbmi->bmiHeader.biHeight=bmp.bmHeight;
pbmi->bmiHeader.biPlanes=bmp.bmPlanes;
pbmi->bmiHeader.biBitCount=bmp.bmBitsPixel;
pbmi->bmiHeader.biCompression=BI_RGB;
pbmi->bmiHeader.biSizeImage=(pbmi->bmiHeader.biWidth+7)/8
*pbmi->bmiHeader.biHeight*cClrBits;
pbmi->bmiHeader.biClrImportant=0;


PBITMAPINFOHEADER pbih;//文件头信息
BITMAPFILEHEADER hdr; //文件的头
HANDLE hf; //文件句柄
// HANDLE hmem; //内存句柄
LPBYTE lpBits; //内存指针
DWORD dwTotal; //总字节数
DWORD cb;
BYTE *hp;
DWORD dwTmp;


pbih=(PBITMAPINFOHEADER)pbmi;

lpBits=(LPBYTE)GlobalAlloc(GMEM_FIXED,pbih->biSizeImage);


//从BMP中取颜色表
GetDIBits(dc.GetSafeHdc(),bitmap,0,
(WORD)pbih->biHeight,lpBits,pbmi,DIB_RGB_COLORS);

//创建BMP文件
hf=CreateFile(_T(lpszName),
GENERIC_READ|GENERIC_WRITE,
(DWORD)0,
(LPSECURITY_ATTRIBUTES)NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL);

hdr.bfType=0x4d42;


//计算整个文件的大小

hdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+
pbih->biSize+pbih->biClrImportant*
sizeof(RGBQUAD)+pbih->biSizeImage);
hdr.bfReserved1=0;
hdr.bfReserved2=0;
hdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+
pbih->biSize+pbih->biClrImportant*sizeof(RGBQUAD));

//写BITMAPFILEHEADER 到BMP文件
WriteFile(hf,(LPVOID)&hdr,sizeof(BITMAPFILEHEADER)+
pbih->biClrImportant*sizeof(RGBQUAD),
(LPDWORD)&dwTmp,(LPOVERLAPPED)NULL);

//写颜色到BMP文件
dwTotal=cb=pbih->biSizeImage;
hp=lpBits;


if(hf)
{
DWORD write;
WriteFile(hf,(LPSTR)hp,dwTotal,&write,NULL);
CloseHandle(hf);
return true;
}

return(true);
}
...全文
167 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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