C++
中实现一个RDP客户端,能够获取屏幕上所有像素的颜色值并将它们转储到文件中。我知道这在概念上与RDP的工作方式有所不同,但这是我应用程序需要的。我正在尝试利用freerdp,但我不确定如何有效地编写一个简单转储所有像素到文件的客户端。迄今为止,我最好的尝试是利用
gdi_GetPixel_32bpp
函数,但是逐个调用此函数对于每个像素显然远非高效。也欢迎使用其他库的解决方案。
C++
中实现一个RDP客户端,能够获取屏幕上所有像素的颜色值并将它们转储到文件中。我知道这在概念上与RDP的工作方式有所不同,但这是我应用程序需要的。我正在尝试利用freerdp,但我不确定如何有效地编写一个简单转储所有像素到文件的客户端。gdi_GetPixel_32bpp
函数,但是逐个调用此函数对于每个像素显然远非高效。使用libfreerdp-gdi非常高效地完成此操作应该很容易。FreeRDP可以将所有内容渲染到一个软件缓冲区中,然后您可以将其转储到文件中,如果需要的话,完全可以在内存中完成此操作,而无需X11环境。由于提到了Linux,一个快速开始的方法是使用xfreerdp和/gdi:sw选项来利用libfreerdp-gdi(默认情况下使用基于X11的实现),然后随着更新的到来将像素转储出来。您可以在xf_sw_end_paint中钩取自己,这个函数会在一系列更新结束时被调用。您可以访问无效区域和像素缓冲区(都在rdpGdi * gdi结构下)。重要字段是gdi->primary_buffer、gdi->dstBpp、gdi->bytesPerPixel、gdi->width和gdi->height。在大多数情况下,您将得到一个XRGB32缓冲区,这很容易处理。如果有疑问,请查看gdi_init()以初始化内部缓冲区。
你可以尝试这样做(免责声明:未经测试的伪代码):
HGDI_DC memDC = gdi_CreateCompatibleDC ( hDC );
HGDI_BITMAP memBM = gdi_CreateCompatibleBitmap ( hDC, screenWidth, screenHeight );
gdi_SelectObject ( memDC, memBM );
gdi_BitBlt(memDC, 0, 0, screenWidth, screenHeight, hDC, 0, 0, GDI_SRCCOPY);
memBM->data
中拥有完整的像素数据数组。 memBM->data 的大小如下: memBM->width * memBM->height * memBM->bytesPerPixel
。hDC
是什么?这段代码应该放在哪里? - Ivaylo Strandjevgdi_SelectObject ( memDC, memBM );
因为 memBM
不是 HGDIOBJECT
类型。 - Ivaylo Strandjev如果您运行VNC X服务器并在其中全屏启动RDP客户端(没有窗口管理器等),则绘图顺序应该如下:
因此,开销应该只是X11协议,尽管这种协议有点笨重,但至少应该通过共享内存段发送。
老实说,我建议您首先尝试这种零编码方法,并查看性能是否真的成为问题。