本文介绍如何使用windows GDI抓取图像并将图像转化为RGB,这样可以传递给FFMPEG进行编解码。步骤如下:
1.获取屏幕或者窗口句柄
首先通过FindWindow找到对应窗口的HWND,桌面HWND 为NULL。
录制分为屏幕录制和窗口录制,对于使用GDI抓图来讲就是获取对应对象的句柄
使用GetWindowDC来获取对应的设备描述符;
hdc_screen = GetWindowDC(hwnd)
2.创建内存hdc
hdc_mem = CreateCompatibleDC(hdc_screen)
3.创建位图
hbm_mem = CreateCompatibleBitmap(hdc_screen, _width, _height);
4.关联设备描述符
SelectObject(hdc_mem, hbm_mem);
5.将窗口或者屏幕图像绘制到位图对象
PrintWindow(_main_record_hwnd, hdc_mem, PW_RENDERFULLCONTENT );
GDI有两种方式来实现绘制PrintWindow和BitBlt,PrintWindow方式效率稍高一点。最好的方式是先使用PrintWindow,如果失败再使用
BitBlt(hdc_mem, 0, 0, _width, _height, hdc_screen, _rect.left, _rect.top, SRCCOPY | CAPTUREBLT)
注意参数PW_RENDERFULLCONTENT和CAPTUREBLT,这两个参数必须有,不然获取不到透明窗体。
6.拿到位图数据
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = _width;
bi.biHeight = _height * (-1);
bi.biPlanes = 1;
bi.biBitCount = 32;//should get from system color bits
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
//scan colors by line order
int ret = GetDIBits(hdc_mem, hbm_mem, 0, _height, _buffer, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
if (ret <= 0 || ret == ERROR_INVALID_PARAMETER) {
&

本文介绍了使用Windows GDI抓取图像并转化为RGB,以便传递给FFMPEG进行编解码的方法。详细步骤包括获取屏幕或窗口句柄、创建内存hdc、创建位图、关联设备描述符、绘制图像、拿到位图数据和释放内存,还给出了完整代码。
最低0.47元/天 解锁文章
1945

被折叠的 条评论
为什么被折叠?



