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

myazhe 2003-09-26 11:07:08
请问如何用cbitmap类在内存里,画一个图形,然后将该图形存成bmp文件
...全文
155 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanjicn 2003-09-29
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc.asp?id=674
对你也许会有帮助!
bluebohe 2003-09-29
  • 打赏
  • 举报
回复
CBitmap bitmap;
HANDLE h=::LoadImage(0,"f:\\tzg.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bitmap.Attach(h);
CFile file("F:\\tzg1.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-29
  • 打赏
  • 举报
回复
CBitmap bitmap;
HANDLE h=::LoadImage(0,"f:\\abc.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bitmap.Attach(h);
CFile file("F:\\abc1.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();
flyelf 2003-09-29
  • 打赏
  • 举报
回复
画一个图形比较简单,要保存成bmp文件,就需要了解bmp文件的格式了
孤必有邻 2003-09-29
  • 打赏
  • 举报
回复
这里有个例子,把界面DC中的图像保存到文件,可以参考:
http://www.yangning.com/cgi-bin/topic.cgi?forum=1&topic=82&show=0
SoftSpider 2003-09-29
  • 打赏
  • 举报
回复
建立一个内存DC (CDC memDC),然后将Bitmap选进DC ,这样可以在DC上画任何东西,然后可以
将这个Bimap存为文件.具体不明白可以再讨论.
apcad 2003-09-28
  • 打赏
  • 举报
回复
http://www.vckbase.com/code/
找找吧,应该有你需要的!
蒋晟 2003-09-28
  • 打赏
  • 举报
回复
Must use a memory DC

Command what is yours
Conquer what is not

19,469

社区成员

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

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