Byte array of an image
我正在尝试制作一个基于浏览器的远程桌面控制器。为此,我要做的是获取远程桌面的屏幕截图,并将其定期发送给客户端。但是由于屏幕变化不大,该方法效率极低。所以我想做的是仅传输连续屏幕截图的差异。这样,我也可以增加fps。最初,我使用python的PIL库将屏幕截图转换为像素数组,然后比较两个数组以查找不同的像素,并仅发送这些像素。但是,要花很多时间才能找到屏幕快照的像素阵列。
然后我遇到了字节数组,它也可以用来表示图像。将图像转换为字节数组比将其转换为像素数组(rgba)更快。但是我该如何解释字节数组。图像的字节数组中存储了什么?我使用这段代码将字节数组转换为8位整数数组:
1 2 3 4 5 6 7 | bytes = readimage("./scimg1.png") i = 0 bytearr = [] while i < len(bytes): bytearr.append(bytes[i]) i+=1 |
如何使用此字节数组比较两个图像并求差。我发现对于相同尺寸(长度,宽度)的两个图像,该数组的长度是不同的。
通常,逐字节比较在所有情况下都不是有效的。您可以使用本文中的这段代码来检查图像之间的差异。您可以根据需要检查其差异,以进行汇总。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |
还要从
更新
我试图检查在两个图像之间进行比较的最快方法:逐像素,PIL还是使用统计技术,但是我没有注意到性能上的巨大差异。该问题可能与图像的重量有关。
1 2 3 4 5 | 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') |
您可以使用ImageChops模块获取图像的差异。您可以使用ImageChops.difference(image1,image2)来获取两个屏幕截图之间的差异。
您还应该在发送图像之前使用gzip压缩图像。这样,您将需要在每个帧中发送较少的数据。这是gzip库的文档。
我建议使用视频编码库,例如PyMedia或pyffmpeg。您显然在这里为速度进行了优化,并且传输图像的速度可能不会比这快。 PyMedia仅支持相当老的mpeg1和2。
您的另一个选择是放弃自定义方法,并绑定到已有的东西上,例如Windows的RDP协议或任何平台的VNC。 (VNC没有响应)