保存界面cd的内容图片到本地
首先需要一个GDI+取得不同类型图片编码类型的函数
1 int GetEncoderClsid( const WCHAR* format, CLSID* pClsid ) 2 { 3 UINT num = 0; // number of image encoders 4 UINT size = 0; // size of the image encoder array in bytes 5 6 ImageCodecInfo* pImageCodecInfo = NULL; 7 8 GetImageEncodersSize(&num, &size); 9 if(size == 0) 10 return -1; // Failure 11 12 pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); 13 if(pImageCodecInfo == NULL) 14 return -1; // Failure 15 16 GetImageEncoders(num, size, pImageCodecInfo); 17 18 for(UINT j = 0; j < num; ++j) 19 { 20 if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) 21 { 22 *pClsid = pImageCodecInfo[j].Clsid; 23 free(pImageCodecInfo); 24 return j; // Success 25 } 26 } 27 28 free(pImageCodecInfo); 29 return -1; // Failure 30 31 }
下面是调用方法,你可以放到任何你想要的地方(注:如果你想要的是背景,要放到OnEraseBkgnd(CDC* pDC)中)
1 CDC* pdc = GetDC( ); CRect RT; GetClientRect( &RT ); //取得屏幕DC(你绘图的那个DC)及绘图区域 2 3 CDC memdc; memdc.CreateCompatibleDC( pdc ); //创建内存DC 4 CBitmap membmp; 5 membmp.CreateCompatibleBitmap( pdc, RT.Width( ), RT.Height( ) ); //创建内存位图 6 memdc.SelectObject( &membmp ); //DC与位图勾连 7 memdc.BitBlt( 0,0, RT.Width( ), RT.Height( ), pdc, 0, 0, SRCCOPY ); //将屏幕DC(你绘图的那个DC)内容拷贝到内存DC当中,相当与将你的绘图拷贝到了membmp上。 8 memdc.SetBkMode(TRANSPARENT); 9 10 Bitmap gBitMap( ( HBITMAP )membmp.m_hObject, NULL ); //创建通过构造函数或者通过FromHBITMAP函数创建一个Bitmap,注意它和Image的区别,一般不用Image,Image功能太少,是Bitmap的基类 11 12 CLSID bmpClsid; 13 GetEncoderClsid(L"image/bmp", &bmpClsid); 14 gBitMap.Save(L"c:\\1.bmp", &bmpClsid, NULL); //保存成bmp 15 16 CLSID pngid; 17 GetEncoderClsid(L"image/png", &pngid); 18 gBitMap.Save(L"c:\\1.png",&pngid,NULL); //保存成png 19 membmp.DeleteObject( ); 20 memdc.DeleteDC( ); 21 i = 0; 22 }
浙公网安备 33010602011771号