我正在尝试制作基于浏览器的远程桌面控制器。为此,我正在做的是获取远程桌面的屏幕截图并定期将其传输到客户端。但是这种方法效率非常低,因为屏幕变化不大。所以我想做的只是传输连续截图的差异。这样我也可以增加fps。最初我使用python的PIL库将屏幕截图转换为像素数组,然后比较两个数组以找到不同的像素并仅发送它们。但是花了很多时间才找到屏幕截图的像素阵列。 然后我遇到了字节数组,它也可以用来表示图像。将图像转换为字节数组比将其转换为像素数组(rgba)要快得多。但是我如何解释字节数组。什么存储在图像的字节数组中?我使用这段代码将字节数组转换为8位整数数组:
bytes = readimage("./scimg1.png")
i = 0
bytearr = []
while i < len(bytes):
bytearr.append(bytes[i])
i+=1
如何使用此bytearray比较两个图像并区分它们。我发现这个数组的长度对于两个相同尺寸(长度,宽度)的图像来说是不同的。
答案 0 :(得分:1)
通常,逐字节比较在所有情况下都不会有效。您可以使用此代码from this article来检查图像之间的差异。您可以根据需要检查差异来进行成本核算。
from itertools import izip
import Image
i1 = Image.open("image1.jpg")
i2 = Image.open("image2.jpg")
assert i1.mode == i2.mode, "Different kinds of images."
assert i1.size == i2.size, "Different sizes."
pairs = izip(i1.getdata(), i2.getdata())
if len(i1.getbands()) == 1:
# for gray-scale jpegs
dif = sum(abs(p1-p2) for p1,p2 in pairs)
else:
dif = sum(abs(c1-c2) for p1,p2 in pairs for c1,c2 in zip(p1,p2))
ncomponents = i1.size[0] * i1.size[1] * 3
print "Difference (percentage):", (dif / 255.0 * 100) / ncomponents
同时检查filecmp.cmp()
filecmp package
它可能会有所帮助。
<强>更新强>
我试图检查两种图片之间比较的最快方式:Pixel by Pixel,PIL或使用statistical techniques,但我无法察觉到性能。问题可能与图像的重量有关。
from PIL import Image, ImageChops
pixelsDifference = ImageChops.difference(Image.open('image1.png'), Image.open('image2.png')).convert('L')
pixelsDifference = pixelsDifference.point(([0] + ([255] * 255)))
Img = pixelsDifference.convert('RGB')
答案 1 :(得分:0)
我建议使用视频编码库,例如PyMedia或pyffmpeg。你显然在这里优化速度,并且在传输图像方面可能不会比这更快。 PyMedia仅支持mpeg1和2,它们相当陈旧。
您的另一个选择是放弃自定义方法并绑定已存在的内容,例如适用于任何平台的Windows或VNC的RDP协议。 (VNC不是那么敏感)
答案 2 :(得分:0)
您可以使用ImageChops模块获取图像的差异。您可以使用ImageChops.difference(image1,image2)来获取两个屏幕截图之间的差异。
在发送图像之前,您还应该使用gzip压缩图像。这样,您将需要每帧发送更少的数据。这是gzip library的文档。