CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

在memDC 上画的图 如何保存到bmp文件中去? GDI

楼主bfire()2005-08-02 23:23:46 在 VC/MFC / 界面 提问

CDC memDC;  
  CBitmap oBitmap;  
  memDC.CreateCompatibleDC(NULL);  
  m_hDC   =   memDC.GetSafeHdc();//全局的,  
  //   create   compatible,   correctly   sized   bitmap  
  oBitmap.CreateCompatibleBitmap(&memDC,m_nFinalBarcodePixelWidth,m_nPixelHeight);  
  //   select   our   bitmap   into   the   device   context  
  CBitmap   *   oldbm   =   memDC.SelectObject(&oBitmap);  
  //   turn   area   white   -   stock   black   bitmap   is   selected  
  memDC.BitBlt(0,0,m_nFinalBarcodePixelWidth,m_nPixelHeight,NULL,0,0,WHITENESS);  
  //   draw   bitmap   into   memory   device   context  
  DrawBitmap();//画图m_hDC是全局;画图是对的.  
   
  /*     BITMAP   bmp;  
          oBitmap.GetBitmap(&bmp);//获得位图信息  
          CFile   file;  
  file.Open("c:\\barcode.bmp",CFile::modeCreate|CFile::modeReadWrite);  
  BITMAPINFOHEADER   bih   =   {0};//位图信息头  
          bih.biBitCount   =   bmp.bmBitsPixel;//每个像素字节大小  
          bih.biCompression   =   BI_RGB;  
          bih.biHeight   =   bmp.bmHeight;//高度  
          bih.biPlanes   =   1;  
          bih.biSize   =   sizeof(BITMAPINFOHEADER);  
          bih.biSizeImage   =   bmp.bmWidthBytes   *   bmp.bmHeight;//图像数据大小  
          bih.biWidth   =   bmp.bmWidth;//宽度  
          BITMAPFILEHEADER   bfh   =   {0};//位图文件头  
          bfh.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER);//到位图数据的偏移量  
          bfh.bfSize   =   bfh.bfOffBits   +   bmp.bmWidthBytes   *   bmp.bmHeight;//文件总的大小  
          bfh.bfType   =   (WORD)0x4d42;  
          file.Write(&bfh,   sizeof(BITMAPFILEHEADER));//写入位图文件头  
          file.Write(&bih,   sizeof(BITMAPINFOHEADER));//写入位图信息头  
          byte   *   p   =   new   byte[bmp.bmWidthBytes   *   bmp.bmHeight];//申请内存保存位图数据  
           
          int   i=GetDIBits(memDC.m_hDC,   (HBITMAP)oBitmap.m_hObject,   0,   m_nPixelHeight,   p,    
                  (LPBITMAPINFO)   &bih,   DIB_RGB_COLORS);//获取位图数据  
          file.Write(p,   bmp.bmWidthBytes   *   bmp.bmHeight);//写入位图数据  
          delete   []   p;  
          file.Close();  
  */  
  //   put   bitmap   on   clipboard  
  ::OpenClipboard(NULL);  
  ::EmptyClipboard();  
  ::SetClipboardData(CF_BITMAP,   oBitmap.m_hObject);  
  ::CloseClipboard();  
  // deselect   object   out   of   device   context  
  memDC.SelectObject(oldbm);  
  //   make   sure   bitmap   not   deleted   with   CBitmap   object  
   
  oBitmap.Detach();  
  return;  
   
    这样不能保存在memDC上画的图.   但是剪切板中有图,贴图到微软画笔中正常的.  
  而中间保存BMP的代码可以用于下面抓屏的  
  void   Screen(CString   str)  
  {  
          CDC   *pDC;//屏幕DC  
          pDC   =   CDC::FromHandle(GetDC(NULL));//获取当前整个屏幕DC  
          int   BitPerPixel   =   pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式  
          int   Width   =   pDC->GetDeviceCaps(HORZRES);  
          int   Height   =   pDC->GetDeviceCaps(VERTRES);  
          CDC   memDC;//内存DC  
          memDC.CreateCompatibleDC(pDC);  
          CBitmap   memBitmap,   *oldmemBitmap;//建立和屏幕兼容的bitmap  
          memBitmap.CreateCompatibleBitmap(pDC,   Width,   Height);  
          oldmemBitmap   =   memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC  
          memDC.BitBlt(0,   0,   Width,   Height,   pDC,   0,   0,   SRCCOPY);//复制屏幕图像到内存DC  
          //以下代码保存memDC中的位图到文件  
          BITMAP   bmp;  
          memBitmap.GetBitmap(&bmp);//获得位图信息  
          FILE   *fp   =   fopen(str,   "w+b");  
          BITMAPINFOHEADER   bih   =   {0};//位图信息头  
          bih.biBitCount   =   bmp.bmBitsPixel;//每个像素字节大小  
          bih.biCompression   =   BI_RGB;  
          bih.biHeight   =   bmp.bmHeight;//高度  
          bih.biPlanes   =   1;  
          bih.biSize   =   sizeof(BITMAPINFOHEADER);  
          bih.biSizeImage   =   bmp.bmWidthBytes   *   bmp.bmHeight;//图像数据大小  
          bih.biWidth   =   bmp.bmWidth;//宽度  
          BITMAPFILEHEADER   bfh   =   {0};//位图文件头  
          bfh.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER);//到位图数据的偏移量  
          bfh.bfSize   =   bfh.bfOffBits   +   bmp.bmWidthBytes   *   bmp.bmHeight;//文件总的大小  
        bfh.bfType   =   (WORD)0x4d42;  
            fwrite(&bfh,   1,   sizeof(BITMAPFILEHEADER),   fp);//写入位图文件头  
            fwrite(&bih,   1,   sizeof(BITMAPINFOHEADER),   fp);//写入位图信息头  
            byte   *   p   =   new   byte[bmp.bmWidthBytes   *   bmp.bmHeight];//申请内存保存位图数据  
          GetDIBits(memDC.m_hDC,   (HBITMAP)   memBitmap.m_hObject,   0,   Height,   p,    
                  (LPBITMAPINFO)   &bih,   DIB_RGB_COLORS);//获取位图数据  
          fwrite(p,   1,   bmp.bmWidthBytes   *   bmp.bmHeight,   fp);//写入位图数据  
          delete   []   p;  
          fclose(fp);  
          memDC.SelectObject(oldmemBitmap);  
  } 问题点数:50、回复次数:5Top

1 楼bfire()回复于 2005-08-02 23:52:37 得分 0

搞定了;  
  bitmap   要和具体设备关联才可以Top

2 楼thisisll(学习王高李,有个好身体)回复于 2005-08-03 08:22:06 得分 10

恭喜啊  
  我也学习学习Top

3 楼qrlvls( 空 气 )回复于 2005-08-03 08:40:13 得分 10

恭喜  
  http://www.codeproject.com/bitmap/drawing2bitmap.aspTop

4 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-08-03 08:48:46 得分 20

恭喜Top

5 楼teli_eurydice(哭泣的仙人掌。。。。)回复于 2005-08-03 08:52:00 得分 10

UP     ,楼主能不能贴出成功后的完整代码,谢谢Top

相关问题

  • 如何将一个给定区域rect中用GDI画出来的图像转成bmp保存起来?
  • 如何保存位bmp?
  • 在数据库中保存bmp字段
  • 如何用API保存bmp图像
  • picturebox为何不能保存成bmp?
  • BMP图像的保存问题
  • GDI 图片加字的重新保存的问题
  • 用GDI画出的图像如何保存啊?
  • GDI+如何保存当前的显示区域
  • 请问:怎样用GDI+创建并保存一个图片?

关键词

  • bih
  • memdc
  • bmp
  • cfile
  • bitmap
  • 图

得分解答快速导航

  • 帖主:bfire
  • thisisll
  • qrlvls
  • goodboyws
  • teli_eurydice

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo