我目前正在尝试从 RFB 协议(VNC 连接)获取帧缓冲区更新,并使用 Python 的 Pillow 或 scikit-image (numpy) 将 32 位 RAW(字节数据字符串)转换为图片,我目前可以使用PyQt4:
picture = PyQt4.QtGui.QImage(width, height, PyQt4.QtGui,QImage.Format_RGB32)
box = PyQt4.QtGui.QImage(box_w, box_h, PyQt4.QtGui,QImage.Format_RGB32)
with PyQt4.QtGui.QPainter(picture) as qp:
qp.drawImage(x, y, box, 0, 0, x_val, y_val)
但是,我不想引入 PyQt4 库只是为了执行此操作。 我怎样才能使用 Pillow 或 scikit-image (w/numpy)做同样的事情?
我尝试使用原始解码器使用 Image.frombuffer() 并将字节直接读取到 ndarray 中;然而,当我在没有任何操作的情况下保存生成的对象/数组时,我可以看到它没有正确接收字节。
我假设你的“32 位 RAW”图片只是一个字节缓冲区,其中每个四元组代表 R、G、B、A 格式的一个像素。您可以使用下面的代码从中创建一个枕头图像。 我使用 array 模块创建一个示例输入内存缓冲区。
from PIL import Image
import array
# Raw bytes representing a 2x2 image.
rawdata = array.array("B", (255, 0, 0, 255, 0, 255, 0, 255,
0, 0, 255, 255, 255, 255, 0, 255))
# Make a pillow image from the raw bytes.
im = Image.frombytes("RGBA", (2, 2), rawdata)
im.show()
im.save("test.png")
我知道已经太晚了,但这是我的答案。不存在 RFB 框架这样的东西。在 RFB 中,您首先经历身份验证阶段并与服务器就数据编码达成一致。之后,您将在远程服务器屏幕更新时获得数据流(您实际上使用 FramebufferUpdateRequest 请求获取数据)。
服务器然后使用 FramebufferUpdateResponse 进行响应,其中包含一个简单的结构(基本上是一个数字,告诉您多个矩形,然后是 n 个矩形)。
你必须绘制这些矩形,随着时间的推移,当你更新你的canvas时,你会得到动画(在本例中为屏幕)。
如果您丢失了画布的一部分(例如错过绘制矩形),则画布的该部分将保持丢失状态,直到该区域的屏幕更新,然后您将获得可用于修复该部分的新矩形。
您还应该考虑这样一个事实:服务器可能会向您发送多个响应(当屏幕自您上次请求以来发生了很大变化时),并且您的客户端应该处理它。
这是您正在处理的事情的简化版本。 RFB 有详细记录,但我强烈建议您使用 Burp Suit 记录 RFB 会话(设置 Proxmox、OpenStack 或其他内容),并在阅读本文档时查看流量。我无法想象开发人员不这样做就能理解这个协议(我就是这么做的)。 这是我使用的文档,希望它有所帮助:vncdotool文档