屏幕截图
屏幕截图 GDI+
// bmp转jpg
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) {
// CLSID encoderClsid;
// GetEncoderClsid(L"image/png", &encoderClsid); // GetEncoderClsid(L"image/bmp", &encoderClsid); // GetEncoderClsid(L"image/gif", &encoderClsid); // GetEncoderClsid(L"image/jpeg", &encoderClsid); // GetEncoderClsid(L"image/tiff", &encoderClsid); UINT num= 0;
UINT size= 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size== 0)
{
return -1;
}
pImageCodecInfo= (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo== NULL)
{
return -1;
}
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j=0; j< num; ++j)
{
if(wcscmp(pImageCodecInfo[j].MimeType, format)== 0) {
*pClsid= pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}
free(pImageCodecInfo);
return -1;
}
void CScreenShotDlg::SaveScreenToJpg()
{
// 得到屏幕DC
HWND hDeskWnd = ::GetDesktopWindow(); //获得屏幕的HWND.
CDC *pDestDC = CDC::FromHandle(::GetDC(hDeskWnd)); //获取当前整个屏幕
DC
int screenWidth = pDestDC->GetDeviceCaps(HORZRES); //屏幕宽
int screenHeight = pDestDC->GetDeviceCaps(VERTRES); //屏幕高
// 创建与屏幕兼容的Bitmap
CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap(pDestDC, screenWidth, screenHeight);
// 创建屏幕的内存DC
CDC memDC;
memDC.CreateCompatibleDC(pDestDC);
// 将兼容Bitmap
选入内存DC
memDC.SelectObject(&memBitmap);
// 将屏幕DC数据copy至内存DC
memDC.BitBlt(0, 0, screenWidth, screenHeight, pDestDC, 0, 0, SRCCOPY);
// 获得位图信息
BITMAP bmpInfo;
memBitmap.GetBitmap(&bmpInfo);
// 生成BITMAPINFO
BITMAPINFO m_BITMAPINFO;
memset(&m_BITMAPINFO, 0, sizeof(BITMAPINFO)); m_BITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); m_BITMAPINFO.bmiHeader.biPlanes = 1;
m_BITMAPINFO.bmiHeader.biBitCount = bmpInfo.bmBitsPixel; m_BITMAPINFO.bmiHeader.biCompression = BI_RGB; m_BITMAPINFO.bmiHeader.biWidth = bmpInfo.bmWidth; m_BITMAPINFO.bmiHeader.biHeight = bmpInfo.bmHeight; // 获取位图数据
BYTE * pBuffer = new BYTE[bmpInfo.bmWidthBytes * bmpInfo.bmHeight];
GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, screenHeight,
pBuffer,
(LPBITMAPINFO) &m_BITMAPINFO, DIB_RGB_COLORS); // 生成位图
Bitmap *pSrcBmp = Bitmap::FromBITMAPINFO(&m_BITMAPINFO, (void*)pBuffer);
// 保存成jpg文件
CLSID encoderClsid;
GetEncoderClsid(L"image/jpeg", &encoderClsid); pSrcBmp->Save(L"d:\\destop.jpg", &encoderClsid); // 释放内存
delete pSrcBmp;
delete pBuffer;
ReleaseDC(pDestDC);
}