SaveBitmapToFile

 int   SaveBitmapToFile(HBITMAP   hBitmap   ,  
        LPSTR   lpFileName)   //hBitmap   为刚才的屏幕位图句柄
{                   //lpFileName   为位图文件名
        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;   //定义文件,分配内存句柄,调色板句柄
   
      //计算位图文件每个像素所占字节数
      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;
      //计算调色板大小
      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,   hPal,   FALSE);
            RealizePalette(hDC);
      }
      //   获取该调色板下新的像素值
      GetDIBits(hDC,   hBitmap,   0,   (UINT)   Bitmap.bmHeight,
          (LPSTR)lpbi   +   sizeof(BITMAPINFOHEADER)
        +dwPaletteSize,
          (BITMAPINFOHEADER   *)
        lpbi,   DIB_RGB_COLORS);
      //恢复调色板      
      if   (hOldPal)
      {
            SelectPalette(hDC,   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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值