请问如何用cbitmap类在内存里,画一个图形,然后将该图形存成bmp文件

myazhe 2003-09-26 11:05:50
请问如何用cbitmap类在内存里,画一个图形,然后将该图形存成bmp文件
...全文
52 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxjddd 2003-12-03
  • 打赏
  • 举报
回复
保存一个文件要这么多啊!
GDI 完全不熟:(
fanfyj 2003-09-26
  • 打赏
  • 举报
回复
up
milson 2003-09-26
  • 打赏
  • 举报
回复
:)
njustcxy 2003-09-26
  • 打赏
  • 举报
回复
来晚了.
bluebohe 2003-09-26
  • 打赏
  • 举报
回复
存图形的代码
CBitmap bitmap;
HANDLE h=::LoadImage(0,"f:\\aaa.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bitmap.Attach(h);

——————————————————————————
CFile file("F:\\aaa1.bmp",CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);

BITMAP size;
bitmap.GetBitmap(&size);
int iHeight=size.bmHeight;
int iWidth=size.bmWidth;
int WIDTHBYTES;
unsigned char * pBitBuf=NULL;

WIDTHBYTES=(iWidth*3+3)/4*4;
pBitBuf=(unsigned char *)malloc(WIDTHBYTES*iHeight);



BITMAPFILEHEADER BitFileHead;
BITMAPINFOHEADER BitInfoHead;


BitInfoHead.biHeight=iHeight;
BitInfoHead.biWidth=iWidth;
BitInfoHead.biSizeImage=WIDTHBYTES*iHeight;
BitInfoHead.biSize = sizeof(BITMAPINFOHEADER);
BitInfoHead.biPlanes = 1;
BitInfoHead.biBitCount = 24;
BitInfoHead.biCompression = BI_RGB;
BitInfoHead.biXPelsPerMeter = 2952; // 75 DPI
BitInfoHead.biYPelsPerMeter = 2952; // 75 DPI
BitInfoHead.biClrUsed = 0;
BitInfoHead.biClrImportant = 0;

BitFileHead.bfType = 'MB'; // Non-portable... sigh
BitFileHead.bfSize = BitInfoHead.biSizeImage+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
BitFileHead.bfReserved1 = 0;
BitFileHead.bfReserved2 = 0;
BitFileHead.bfOffBits =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

BITMAPINFO mapinfo;
mapinfo.bmiHeader=BitInfoHead;
// mapinfo.bmiColors

HDC hdc = CreateIC (TEXT("DISPLAY"), NULL, NULL, NULL) ;
::GetDIBits (hdc, (HBITMAP)h,0, iHeight, pBitBuf, &mapinfo, DIB_RGB_COLORS) ;


file.Write(&BitFileHead,sizeof(BITMAPFILEHEADER));
file.Write(&BitInfoHead,sizeof(BITMAPINFOHEADER));
file.Write(pBitBuf,WIDTHBYTES*iHeight);

free(pBitBuf);



ar.Close();
file.Close();
bitmap.DeleteObject();
bluebohe 2003-09-26
  • 打赏
  • 举报
回复
画图形的代码
CRect rt;
GetClientRect(rt);
CBitmap bitmap;
CBitmap* pOldbitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
bitmap.LoadBitmap(IDB_WORKSPACE);
pOldbitmap = MemDC.SelectObject(&bitmap);
pDC->BitBlt(50,50,rt.Width()-10,rt.Height()-10,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldbitmap);
MemDC.DeleteDC();
bluebohe 2003-09-26
  • 打赏
  • 举报
回复
画图形的代码
CRect rt;
GetClientRect(rt);
CBitmap bitmap;
CBitmap* pOldbitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
bitmap.LoadBitmap(IDB_WORKSPACE);
pOldbitmap = MemDC.SelectObject(&bitmap);
pDC->BitBlt(50,50,rt.Width()-10,rt.Height()-10,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldbitmap);
MemDC.DeleteDC();
Onega 2003-09-26
  • 打赏
  • 举报
回复
void savebmp(CBitmap& bmp)
{
CPictureHolder picture;
picture.CreateFromBitmap((HBITMAP)bmp, NULL, TRUE);
LPPICTUREDISP pPictureDisp=picture.GetPictureDispatch();
pPictureDisp->Release(); // must be released
IStorage* pStg = 0;

hr = ::StgCreateDocfile(L"c:\\picttest",
STGM_SHARE_EXCLUSIVE |
STGM_CREATE |
STGM_READWRITE,
0, &pStg);
if(SUCCEEDED(hr))
{
IStream* pStream = 0;

hr = pStg->CreateStream(L"PICTURE",
STGM_SHARE_EXCLUSIVE |
STGM_CREATE |
STGM_READWRITE,
0, 0, &pStream);
if(SUCCEEDED(hr))
{
hr = pPictureDisp->SaveAsFile(pStream,
TRUE, // save mem copy
NULL);
pStream->Release();
}
pStg->Release();
}
pPictureDisp->Release();
}
Onega 2003-09-26
  • 打赏
  • 举报
回复
http://www.codeproject.com/bitmap/bitmapdc.asp
CBitmapDC - An automatic memory DC wrapper
孤必有邻 2003-09-26
  • 打赏
  • 举报
回复
这里有个例子程序,是从界面DC保存图像到bmp文件,把界面dc换成内存dc就可以了
http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=82&show=0

16,551

社区成员

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

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

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