使用dshow获取屏幕截图 不包含鼠标

正常录制屏幕可以使用ffmpeg直接获取屏幕图像:

使用ffmpeg获取屏幕图像


但是 现在有时希望获取的屏幕截图上不要有鼠标,研究了好久 发现ffmpeg似乎做不到。

查了好久发现可以直接使用dshow来获取:

代码如下:


#ifndef GETSCREEN_H
#define GETSCREEN_H

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
         //定义成一个可变参数列表的指针

typedef unsigned char uint8_t;

/**
 * @brief GetBitmapFromScreen 获取屏幕截图
 * @param w 返回屏幕宽度
 * @param h 返回高度
 * @return 返回rgb数据
 */
uint8_t* GetBitmapFromScreen(int *w, int *h);
int SaveBitmapToFile(BITMAP *bitmap, LPSTR lpFileName,char *lpBuf);


#endif // GETSCREEN_H




.cpp文件

需要加上这几个库
//LIBS += -lddraw -lgdi32 -lole32 -loleaut32

#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            //定义成一个可变参数列表的指针 int SaveBitmapToFile(BITMAP *bitmap, LPSTR lpFileName,char *lpBuf) { DWORD dwWritten; BITMAPFILEHEADER bmfHdr; BITMAPINFOHEADER bi; HANDLE fh=NULL; bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth= bitmap->bmWidth; bi.biHeight = bitmap->bmHeight; bi.biPlanes = 1; bi.biBitCount =bitmap->bmBitsPixel*8; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; //将char* 转成wchar_t*的实现函数如下: char *CStr = lpFileName; size_t len = strlen(CStr) + 1; size_t converted = 0; wchar_t *WStr; WStr=(wchar_t*)malloc(len*sizeof(wchar_t)); mbstowcs_s(&converted, WStr, len, CStr, _TRUNCATE); fh = CreateFile(WStr, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE; bmfHdr.bfType = 0x4D42; // "BM" bmfHdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+bitmap->bmWidth*bitmap->bmHeight*bitmap->bmBitsPixel; bmfHdr.bfReserved1 = 0; bmfHdr.bfReserved2 = 0; bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER); WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); WriteFile(fh, (char *)&bi,sizeof(BITMAPINFOHEADER), &dwWritten, NULL); WriteFile(fh, (char *)lpBuf,bitmap->bmWidth*bitmap->bmHeight*bitmap->bmBitsPixel, &dwWritten, NULL); FlushFileBuffers(fh); CloseHandle(fh); return true; } uint8_t* GetBitmapFromScreen(int *w, int*h) { char *lpBuf; HBITMAP hBitmap,hOld ; HDC hDC,hcDC; BITMAP bb;BITMAPINFO b; HANDLE hp,fh=NULL; DWORD dwX,dwY; //*************** dwX=GetSystemMetrics(SM_CXSCREEN); dwY=GetSystemMetrics(SM_CYSCREEN); *w = dwX; *h = dwY; hDC=GetDC(NULL); hcDC=CreateCompatibleDC(hDC); hBitmap=CreateCompatibleBitmap(hDC,dwX,dwY); hOld=(HBITMAP)SelectObject(hcDC,hBitmap); BitBlt(hcDC,0, 0,dwX,dwY, hDC, 0, 0, SRCCOPY); bb.bmWidth=dwX; bb.bmHeight =dwY; bb.bmPlanes = 1; bb.bmWidthBytes=bb.bmWidth*3; bb.bmBitsPixel=3; bb.bmType=0; b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); b.bmiHeader.biWidth=dwX; b.bmiHeader.biHeight =dwY; b.bmiHeader.biPlanes = 1; b.bmiHeader.biBitCount =3*8; b.bmiHeader.biCompression = BI_RGB; b.bmiHeader.biSizeImage = 0; b.bmiHeader.biXPelsPerMeter = 0; b.bmiHeader.biYPelsPerMeter = 0; b.bmiHeader.biClrUsed = 0; b.bmiHeader.biClrImportant = 0; b.bmiColors[0].rgbBlue=8; b.bmiColors[0].rgbGreen=8; b.bmiColors[0].rgbRed=8; b.bmiColors[0].rgbReserved=0; hp=GetProcessHeap(); lpBuf=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4); GetDIBits(hcDC,hBitmap,0,dwY,lpBuf,&b,DIB_RGB_COLORS); // char *lpFileName = "out.bmp"; // SaveBitmapToFile(&bb,lpFileName,lpBuf); //将截图保存成bmp图片 BYTE *rgbData = (unsigned char *)malloc(dwX * dwY * 3); memset(rgbData,0,dwX * dwY * 3); memcpy(rgbData,lpBuf,dwX * dwY * 3); ReleaseDC(NULL,hDC); DeleteDC(hcDC); DeleteObject(hBitmap); DeleteObject(hOld); HeapFree(hp,0,lpBuf); return rgbData; } //调用方法 int main() { int w; int h; unsigned char* rgbData = GetBitmapFromScreen(&w,&h); } empty 
           
          
         
       
      
      
     
     
    
    
   
   



关于获取到的rgb数据如何转换成Yuv请查看另一篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值