保存剪贴板中的位图到文件

 #include <iostream>
#include <fstream>
using namespace std;

 

BOOL   SaveBitmap(const   BITMAP   &bm,HDC   hDC,HBITMAP   hBitmap,LPCTSTR   szFileName)  
  {  
   
  int   nBitPerPixel   =   bm.bmBitsPixel;//获得颜色模式  
          int   nW   =   bm.bmWidth;  
          int   nH   =   bm.bmHeight;  
  int   nPalItemC=bm.bmPlanes; //调色板项的个数  
  int   nBmpInfSize=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nPalItemC;//位图信息的大小  
  int   nDataSize=(nBitPerPixel*nW+31)/32*4*nH;//位图数据的大小  
  //初始化位图信息  
          BITMAPFILEHEADER   bfh   =   {0};//位图文件头  
          bfh.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   nBmpInfSize;//sizeof(BITMAPINFOHEADER);//到位图数据的偏移量  
          bfh.bfSize   =   bfh.bfOffBits   +   nDataSize;//文件总的大小  
          bfh.bfType   =   (WORD)0x4d42;//位图标志  
  char   *   p   =   new   char[nBmpInfSize+nDataSize];//申请内存位图数据空间(包括信息头)  
          memset(p,0,nBmpInfSize);//将信息头的数据初始化为0  
  LPBITMAPINFOHEADER   pBih   =   (LPBITMAPINFOHEADER)   p;//位图信息头  
          pBih->biCompression   =   BI_RGB;  
  pBih->biBitCount   =   nBitPerPixel;//每个图元像素使用的位数  
          pBih->biHeight   =   nH;//高度  
  pBih->biWidth   =   nW;//宽度  
          pBih->biPlanes   =   1;  
          pBih->biSize   =   sizeof(BITMAPINFOHEADER);  
          pBih->biSizeImage   =   nDataSize;//图像数据大小  
          char   *pData=p+nBmpInfSize;  
  //DDB转换为DIB  
          ::GetDIBits(hDC,hBitmap,0,nH,pData,(LPBITMAPINFO)   pBih,   DIB_RGB_COLORS);//获取位图数据  
  ofstream   ofs(szFileName,ios::binary);  
  if(ofs.fail())  
  return   FALSE;  
          ofs.write((const   char*)&bfh,   sizeof(BITMAPFILEHEADER));//写入位图文件头  
          ofs.write((const   char*)pBih,   nBmpInfSize);//写入位图信息数据  
          ofs.write((const   char*)pData,   nDataSize);//写入位图数据  
  return   TRUE;  
  }  
   
  void   main()  
  {  
  HWND   hWnd=NULL;  
  ::OpenClipboard(hWnd);   //   打开剪贴板  
  HANDLE   hBitmap   =   ::GetClipboardData(CF_BITMAP);   //   获取剪贴板数据句柄  
  if(hBitmap==NULL)  
  {  
  return   ;  
  }  
  HDC   hDC   =   ::GetDC(hWnd);   //   获取设备环境句柄  
  HDC   hdcMem   =   CreateCompatibleDC(hDC);   //   创建与设备相关的内存环境  
  SelectObject(hdcMem,   hBitmap);   //   选择对象  
  SetMapMode(hdcMem,   GetMapMode(hDC));   //   设置映射模式  
  BITMAP   bm;   //   得到位图对象  
  GetObject(hBitmap,   sizeof(BITMAP),   &bm);  
  SaveBitmap(bm,hDC,(HBITMAP)hBitmap,"clip.bmp");  
  ::ReleaseDC(hWnd,   hDC);   //   释放设备环境句柄  
  DeleteDC(hdcMem);   //   删除内存环境  
  ::CloseClipboard();   //   关闭剪贴板  
   
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值