屏幕截图

来源:互联网 发布:07年nba总决赛数据 编辑:程序博客网 时间:2024/06/11 18:39

屏幕截图 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);
}