我想在C++
中实现一个RDP客户端,它能够获得屏幕上所有像素的颜色值,并将它们转储到一个文件中。我知道这在概念上与RDP的工作方式不同,但我的应用程序需要它。我正在尝试使用freerdp,但我不确定如何才能高效地编写一个简单地转储文件中所有像素的客户端。
到目前为止,我最好的尝试是使用函数gdi_GetPixel_32bpp
,但当然,依次为每个像素调用此函数的效率很低。
使用另一个库的解决方案也将非常受欢迎。
发布于 2014-03-26 03:05:41
使用libfreerdp-gdi以一种非常有效的方式实现这一点应该是相当容易的。FreeRDP可以将所有内容呈现到一个软件缓冲区中,然后您可以将其转储到一个文件中,并且如果您愿意,您可以完全在内存中执行此操作,而无需X11环境。由于提到了Linux,一种快速入门的方法是使用带有/gdi:sw选项的xfreerdp来利用libfreerdp-gdi (默认情况下使用基于X11的实现),然后在更新时转储像素。您可以在xf_sw_end_paint中挂接自己,它在更新数组的末尾调用。您可以访问无效区域和像素缓冲区(都在rdpGdi* gdi结构下)。重要的字段有gdi->primary_buffer、gdi->dstBpp、gdi->bytesPerPixel、gdi->width和gdi->height。在大多数情况下,你会得到一个XRGB32缓冲区,这很容易处理。如果有疑问,请看一下初始化内部缓冲区的gdi_init()。
发布于 2014-01-06 22:58:03
你可以尝试这样做(免责声明,未测试的伪代码):
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->数据大小如下:memBM->width * memBM->height * memBM->bytesPerPixel
希望这至少能对你有所帮助。
发布于 2014-01-06 23:02:36
如果您运行VNC X服务器并在其中全屏启动RDP客户端(没有窗口管理器等),则绘制顺序应如下所示:
因此,开销应该只是X11协议,该协议诚然很笨拙,但至少应该通过共享内存段发送。
老实说,我会先尝试这种零编码方法,看看性能是否真的是个问题。
https://stackoverflow.com/questions/20905662
复制相似问题