剪切板中的图片处理

 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();   //   关闭剪贴板

 

你可能感兴趣的:(图片处理)