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

如何保存图片到文件中去?

楼主ponydph(pony)2004-12-01 13:52:41 在 VC/MFC / 基础类 提问

如题  
  我的程序想实现每隔一段时间自动拷贝当前屏幕保存到某个文件中去.  
  请问当把位图写到文件中去时候.  
  怎么设置.  
  假设有个位图结构HBITMAP     bm;  
  然后用CreateFile函数.  
  怎么操作??? 问题点数:20、回复次数:6Top

1 楼HunterForPig(留着口水的猪)回复于 2004-12-01 13:55:55 得分 5

File   file;  
  BITMAPFILEHEADER   bmfHeader;  
  DWORD   dwLen=0;  
  TRY{  
  file.Open(FileName,CFile::modeWrite|CFile::modeCreate);  
   
  bmfHeader.bfType='MB';  
  bmfHeader.bfSize=sizeof(BITMAPFILEHEADER)+this->m_dwDibSize;  
  bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+m_nNumColors*sizeof(RGBQUAD);  
   
  file.Write(&bmfHeader,sizeof(BITMAPFILEHEADER));  
   
  file.Write(m_pDib,m_dwDibSize);  
  }  
  CATCH(CFileException,e)  
  {  
  TRACE("%d",e->m_cause);  
  file.Close();  
  e->Delete();  
  return   FALSE;  
  }  
  END_CATCH  
  return   TRUE;Top

2 楼vcleaner(我没当大哥很久了.......)回复于 2004-12-01 13:59:35 得分 10

参考:抓屏保存  
  void   CCaptureDlg::SaveBmp()  
  {  
  CDC   dc;  
  dc.CreateDC("DISPLAY",NULL,NULL,NULL);  
  CBitmap   bm;  
  int   Width=GetSystemMetrics(SM_CXSCREEN);  
  int   Height=GetSystemMetrics(SM_CYSCREEN);  
  bm.CreateCompatibleBitmap(&dc,Width,Height);  
  CDC   tdc;  
  tdc.CreateCompatibleDC(&dc);  
  CBitmap*pOld=tdc.SelectObject(&bm);  
  tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);  
  tdc.SelectObject(pOld);  
  BITMAP   btm;  
  bm.GetBitmap(&btm);  
  DWORD   size=btm.bmWidthBytes*btm.bmHeight;  
  LPSTR   lpData=(LPSTR)GlobalAllocPtr(GPTR,size);  
  /////////////////////////////////////////////  
  BITMAPINFOHEADER   bih;  
  bih.biBitCount=btm.bmBitsPixel;  
  bih.biClrImportant=0;  
  bih.biClrUsed=0;  
  bih.biCompression=0;  
  bih.biHeight=btm.bmHeight;  
  bih.biPlanes=1;  
  bih.biSize=sizeof(BITMAPINFOHEADER);  
  bih.biSizeImage=size;  
  bih.biWidth=btm.bmWidth;  
  bih.biXPelsPerMeter=0;  
  bih.biYPelsPerMeter=0;  
  ///////////////////////////////////  
  GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);  
  // bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱  
  //////////////////////////////  
  static   int   filecount=0;  
  CString   name;  
  name=   "D:\\Test.bmp";  
  BITMAPFILEHEADER   bfh;  
  bfh.bfReserved1=bfh.bfReserved2=0;  
  bfh.bfType=((WORD)('M'<<   8)|'B');  
  bfh.bfSize=54+size;  
  bfh.bfOffBits=54;  
  CFile   bf;  
  if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){  
  bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));  
  bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));  
  bf.WriteHuge(lpData,size);  
  bf.Close();  
  }  
  GlobalFreePtr(lpData);  
  UpdateData(FALSE);  
  }Top

3 楼ponydph(pony)回复于 2004-12-01 14:03:11 得分 0

GlobalAllocPtr是什么函数?Top

4 楼HanYanBin(滴血的心)回复于 2004-12-01 14:16:02 得分 0

站个位子,GlobalAllocPtr   和   GlobalFreePtr   相对的,分配内存什么的Top

5 楼ponydph(pony)回复于 2004-12-01 14:35:22 得分 0

我替换为GlobalAlloc了,VC6.0没有GlobalAllocPtr函数Top

6 楼crystal521(【云淡风轻】)回复于 2004-12-01 15:22:37 得分 5

将位图句柄保存为BMP文件    
  BOOL   SaveToFile(HBITMAP   hBitmap,   LPCTSTR   lpszFileName)  
  {  
      HDC   hDC;  
      //当前分辨率下每象素所占字节数  
      int   iBits;  
      //位图中每象素所占字节数  
      WORD   wBitCount;  
      //定义调色板大小,   位图中像素字节大小   ,位图文件大小   ,   写入文件字节数  
      DWORD   dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;  
      //位图属性结构  
      BITMAP   Bitmap;  
      //位图文件头结构  
      BITMAPFILEHEADER   bmfHdr;  
      //位图信息头结构  
      BITMAPINFOHEADER   bi;  
      //指向位图信息头结构  
      LPBITMAPINFOHEADER   lpbi;  
      //定义文件,分配内存句柄,调色板句柄  
      HANDLE   fh,   hDib,   hPal,hOldPal=NULL;  
       
      //计算位图文件每个像素所占字节数  
      hDC   =   CreateDC("DISPLAY",   NULL,   NULL,   NULL);  
      iBits   =   GetDeviceCaps(hDC,   BITSPIXEL)   *   GetDeviceCaps(hDC,   PLANES);  
      DeleteDC(hDC);  
      if   (iBits   <=   1)  
          wBitCount   =   1;  
      else   if   (iBits   <=   4)  
          wBitCount   =   4;  
      else   if   (iBits   <=   8)  
          wBitCount   =   8;  
      else  
          wBitCount   =   24;  
      GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);  
      bi.biSize   =   sizeof(BITMAPINFOHEADER);  
      bi.biWidth   =   Bitmap.bmWidth;  
      bi.biHeight   =   Bitmap.bmHeight;  
      bi.biPlanes   =   1;  
      bi.biBitCount   =   wBitCount;  
      bi.biCompression   =   BI_RGB;  
      bi.biSizeImage   =   0;  
      bi.biXPelsPerMeter   =   0;  
      bi.biYPelsPerMeter   =   0;  
      bi.biClrImportant   =   0;  
      bi.biClrUsed   =   0;  
      dwBmBitsSize   =   ((Bitmap.bmWidth   *   wBitCount   +   31)   /   32)   *   4   *   Bitmap.bmHeight;  
      //为位图内容分配内存    
      hDib   =   GlobalAlloc(GHND,dwBmBitsSize   +   dwPaletteSize   +   sizeof(BITMAPINFOHEADER));  
      lpbi   =   (LPBITMAPINFOHEADER)GlobalLock(hDib);  
      *lpbi   =   bi;  
      //   处理调色板      
      hPal   =   GetStockObject(DEFAULT_PALETTE);  
      if   (hPal)  
      {    
          hDC   =   GetDC(NULL);  
          hOldPal   =   SelectPalette(hDC,   (HPALETTE)hPal,   FALSE);  
          RealizePalette(hDC);  
      }  
       
      //   获取该调色板下新的像素值  
      GetDIBits(hDC,   hBitmap,   0,   (UINT)   Bitmap.bmHeight,   (LPSTR)lpbi   +   sizeof(BITMAPINFOHEADER)    
          +dwPaletteSize,   (BITMAPINFO   *)lpbi,   DIB_RGB_COLORS);  
      //恢复调色板  
      if   (hOldPal)  
      {  
          SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);  
          RealizePalette(hDC);  
          ReleaseDC(NULL,   hDC);  
      }  
      //创建位图文件      
      fh   =   CreateFile(lpszFileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,    
          FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);    
       
      if   (fh   ==   INVALID_HANDLE_VALUE)  
          return   FALSE;    
      //   设置位图文件头    
      bmfHdr.bfType   =   0x4D42;   //   "BM"  
      dwDIBSize   =   sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER)   +   dwPaletteSize   +   dwBmBitsSize;  
      bmfHdr.bfSize   =   dwDIBSize;  
      bmfHdr.bfReserved1   =   0;  
      bmfHdr.bfReserved2   =   0;  
      bmfHdr.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)   +   (DWORD)sizeof(BITMAPINFOHEADER)   +   dwPaletteSize;  
      //   写入位图文件头  
      WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);  
      //   写入位图文件其余内容  
      WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);  
      //清除  
      GlobalUnlock(hDib);  
      GlobalFree(hDib);  
      CloseHandle(fh);  
      return   TRUE;  
  }  
  Top

相关问题

  • 如何将PictureBox中保存的图片保存到文件中去?
  • 如何在*.dll文件中保存图片和声音
  • 如何将 HBITMAP保存成jpg类型的图片文件
  • 如何将Bitmap对象,以图片文件保存到本地
  • 如何将VC中PictureBox中显示的图片取出并保存成文件?
  • 如何把FORM的背景图片保存成一张.bmp的文件?
  • 如何把窗体上某块显示内容保存为图片文件?
  • 如何使用vb把图片保存到特定的文件夹里面。
  • 如何将rtf文件(含图片)保存在Access数据库中
  • 请问如何将剪切板里的图片保存成文件,谢谢

关键词

  • 文件
  • dc
  • null
  • bmfheader
  • 保存
  • bitmapfileheader
  • bm
  • 文件中去
  • sizeof

得分解答快速导航

  • 帖主:ponydph
  • HunterForPig
  • vcleaner
  • crystal521

相关链接

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

广告也精彩

反馈

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