保存CBitmap图片到硬盘的方法

来自:http://blog.sina.com.cn/s/blog_6ee382440100moeu.html


void WriteBmp(CBitmap   *PBitmap)
{
 BITMAPINFO   *m_pBMI;  
    BYTE   *m_pDIBData;  
    BITMAPFILEHEADER   bfh;  
    BITMAPINFOHEADER   bi;  
    BITMAP   BM;  
    PBitmap->GetObject(sizeof(BM),&BM);  
    CClientDC   dc(this);  
    bi.biSize     =   sizeof(BITMAPINFOHEADER);  
    bi.biWidth     =   BM.bmWidth;  
    bi.biHeight       =   BM.bmHeight;  
    bi.biPlanes       =   1;  
    bi.biBitCount     =   24;  
    bi.biCompression   =   0;  
    bi.biSizeImage     =   0;  
    bi.biXPelsPerMeter   =   0;  
    bi.biYPelsPerMeter   =   0;  
    bi.biClrUsed     =   0;  
    bi.biClrImportant   =   0;  
           
    bfh.bfType=0x4d42;  
    bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER);  
    bfh.bfSize=bfh.bfOffBits+BM.bmWidth*BM.bmHeight*3;  
    bfh.bfReserved1=0;  
    bfh.bfReserved2=0;  
     
    m_pBMI=(BITMAPINFO*)new   char[sizeof(BITMAPINFO)];  
          m_pDIBData=(BYTE*)new   char[bfh.bfSize-bfh.bfOffBits];  
     
    memcpy(m_pBMI,&bi,sizeof(BITMAPINFOHEADER));  
    GetDIBits(dc.GetSafeHdc(),   (HBITMAP)PBitmap->GetSafeHandle(),   0l,  (DWORD)bi.biHeight,  
      (LPVOID)m_pDIBData,(LPBITMAPINFO)m_pBMI,   (DWORD)DIB_RGB_COLORS);  
      CFile   file;  
    if(!file.Open("d:\\002.bmp",CFile::modeCreate|CFile::modeWrite))  
    {  
      MessageBox("error!");  
      return 
    }  
    file.Write(&bfh,sizeof(bfh));  
    file.Write(m_pBMI,sizeof(BITMAPINFOHEADER));  
    file.Write(m_pDIBData,BM.bmWidth*BM.bmHeight*3);  
    file.Close();  


bool SaveBitmapToFile(CBitmap   *bitmap,LPSTR   lpFileName)   //hBitmap   为刚才的屏幕位图句柄   lpFileName   为位图文件名  
           
 HBITMAP   hBitmap;  
 HDC hDC; //设备描述表  
 int iBits; //当前显示分辨率下每个像素所占字节数  
 WORD                         wBitCount; //位图中每个像素所占字节数  
 DWORD                       dwPaletteSize=0, //定义调色板大小,   位图中像素字节大小   ,位图文件大小   ,   写入文件字节数  
  dwBmBitsSize,  
  dwDIBSize,   dwWritten;  
 BITMAP                     Bitmap; //位图属性结构  
 BITMAPFILEHEADER       bmfHdr; //位图文件头结构  
 BITMAPINFOHEADER       bi; //位图信息头结构    
 LPBITMAPINFOHEADER   lpbi; //指向位图信息头结构  
 HANDLE                     fh,   hDib,   hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄  

 //计算位图文件每个像素所占字节数  
 hBitmap   =   (HBITMAP)*bitmap;  
 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   if   (iBits   <=   24)  
  wBitCount   =   24;  
 else if ( iBits <= 32 )
  wBitCount = 32;

 //计算调色板大小  
 if   (wBitCount   <=   8)  
  dwPaletteSize   =   (1   <<     wBitCount)   *   sizeof(RGBQUAD);  

 //设置位图信息头结构  
 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.biClrUsed                   =   0;  
 bi.biClrImportant             =   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,  
  (LPBITMAPINFO   )  
  lpbi,   DIB_RGB_COLORS);  

 //恢复调色板        
 if   (hOldPal)  
  
  SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);  
  RealizePalette(hDC);  
  ::ReleaseDC(NULL,   hDC);  
  

 //创建位图文件          
 fh   =   CreateFile(lpFileName,   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;  
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值