关于python:图像的字节数组

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

还要从filecmp package中检查filecmp.cmp(),这可能会有所帮助。

更新

我试图检查在两个图像之间进行比较的最快方法:逐像素,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没有响应)