剪切板中的图片处理

 1 //把剪切板中的图片保存到图片
 2     HWND   hWnd=GetSafeHwnd(); 
 3     ::OpenClipboard(hWnd);   //   打开剪贴板 
 4     HANDLE   hBitmap   =   ::GetClipboardData(CF_BITMAP);   //   获取剪贴板数据句柄 
 5     if(hBitmap==NULL) 
 6     { 
 7         return   ; 
 8     } 
 9     HDC   hDC   =   ::GetDC(hWnd);   //   获取设备环境句柄 
10     HDC   hdcMem   =   CreateCompatibleDC(hDC);   //   创建与设备相关的内存环境 
11     SelectObject(hdcMem,   hBitmap);   //   选择对象 
12     SetMapMode(hdcMem,   GetMapMode(hDC));   //   设置映射模式 
13     BITMAP   bm;   //   得到位图对象 
14     GetObject(hBitmap,   sizeof(BITMAP),   &bm); 
15     DeleteFile("c:\\clip.bmp");
16     SaveBitmap(bm,hDC,(HBITMAP)hBitmap, "c:\\clip.bmp"); 
17     ::ReleaseDC(hWnd,   hDC);   //   释放设备环境句柄 
18     DeleteDC(hdcMem);   //   删除内存环境 
19     ::CloseClipboard();   //   关闭剪贴板
20 }
 1 //保存到本地函数
 2 BOOL   SaveBitmap(const   BITMAP   &bm,HDC   hDC,HBITMAP   hBitmap,LPCTSTR   szFileName) 
 3 { 
 4 
 5     int   nBitPerPixel   =   bm.bmBitsPixel;//获得颜色模式 
 6     int   nW   =   bm.bmWidth; 
 7     int   nH   =   bm.bmHeight; 
 8     int   nPalItemC=bm.bmPlanes; //调色板项的个数 
 9     int   nBmpInfSize=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nPalItemC;//位图信息的大小 
10     int   nDataSize=(nBitPerPixel*nW+31)/32*4*nH;//位图数据的大小 
11     //初始化位图信息 
12     BITMAPFILEHEADER   bfh   =   {0};//位图文件头 
13     bfh.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   nBmpInfSize;//sizeof(BITMAPINFOHEADER);//到位图数据的偏移量 
14     bfh.bfSize   =   bfh.bfOffBits   +   nDataSize;//文件总的大小 
15     bfh.bfType   =   (WORD)0x4d42;//位图标志 
16     char   *   p   =   new   char[nBmpInfSize+nDataSize];//申请内存位图数据空间(包括信息头) 
17     memset(p,0,nBmpInfSize);//将信息头的数据初始化为0 
18     LPBITMAPINFOHEADER   pBih   =   (LPBITMAPINFOHEADER)   p;//位图信息头 
19     pBih-> biCompression   =   BI_RGB; 
20     pBih-> biBitCount   =   nBitPerPixel;//每个图元像素使用的位数 
21     pBih-> biHeight   =   nH;//高度 
22     pBih-> biWidth   =   nW;//宽度 
23     pBih-> biPlanes   =   1; 
24     pBih-> biSize   =   sizeof(BITMAPINFOHEADER); 
25     pBih-> biSizeImage   =   nDataSize;//图像数据大小 
26     char   *pData=p+nBmpInfSize; 
27     //DDB转换为DIB 
28     ::GetDIBits(hDC,hBitmap,0,nH,pData,(LPBITMAPINFO)   pBih,   DIB_RGB_COLORS);//获取位图数据 
29     ofstream   ofs(szFileName,ios::binary); 
30     if(ofs.fail()) 
31         return   FALSE; 
32     ofs.write((const   char*)&bfh,   sizeof(BITMAPFILEHEADER));//写入位图文件头 
33     ofs.write((const   char*)pBih,   nBmpInfSize);//写入位图信息数据 
34     ofs.write((const   char*)pData,   nDataSize);//写入位图数据 
35     return   TRUE; 
36 } 
 1 //加载本地图片 并绘制    
 2 
 3 HBITMAP hBitmap = (HBITMAP) ::LoadImage(NULL, "c:\\clip.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
 4     HDC   hDC   =   ::GetDC(GetSafeHwnd());   //   获取设备环境句柄 
 5     HDC   hdcMem   =   CreateCompatibleDC(hDC);   //   创建与设备相关的内存环境 
 6     SelectObject(hdcMem,   hBitmap);   //   选择对象 
 7     BITMAP   bm;   //   得到位图对象 
 8     GetObject(hBitmap,   sizeof(BITMAP),   &bm); 
 9 
10     BitBlt(hDC,   0,   0,   bm.bmWidth,   bm.bmHeight,   hdcMem,   0,   0,   SRCCOPY);   //位图复制 
11     ::ReleaseDC(GetSafeHwnd(),   hDC);   //   释放设备环境句柄 
12     DeleteDC(hdcMem);   //   删除内存环境 
13     ::CloseClipboard();   //   关闭剪贴板
原文地址:https://www.cnblogs.com/FCoding/p/2698836.html