字节数组的图像

时间:2014-11-02 08:42:09

标签: python bytearray

我正在尝试制作基于浏览器的远程桌面控制器。为此,我正在做的是获取远程桌面的屏幕截图并定期将其传输到客户端。但是这种方法效率非常低,因为屏幕变化不大。所以我想做的只是传输连续截图的差异。这样我也可以增加fps。最初我使用python的PIL库将屏幕截图转换为像素数组,然后比较两个数组以找到不同的像素并仅发送它们。但是花了很多时间才找到屏幕截图的像素阵列。 然后我遇到了字节数组,它也可以用来表示图像。将图像转换为字节数组比将其转换为像素数组(rgba)要快得多。但是我如何解释字节数组。什么存储在图像的字节数组中?我使用这段代码将字节数组转换为8位整数数组:

bytes = readimage("./scimg1.png")

i = 0
bytearr = [] 
while i < len(bytes):
    bytearr.append(bytes[i])
    i+=1

如何使用此bytearray比较两个图像并区分它们。我发现这个数组的长度对于两个相同尺寸(长度,宽度)的图像来说是不同的。

3 个答案:

答案 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 PixelPIL或使用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)

我建议使用视频编码库,例如PyMediapyffmpeg。你显然在这里优化速度,并且在传输图像方面可能不会比这更快。 PyMedia仅支持mpeg1和2,它们相当陈旧。

您的另一个选择是放弃自定义方法并绑定已存在的内容,例如适用于任何平台的Windows或VNC的RDP协议。 (VNC不是那么敏感)

答案 2 :(得分:0)

您可以使用ImageChops模块获取图像的差异。您可以使用ImageChops.difference(image1,image2)来获取两个屏幕截图之间的差异。

在发送图像之前,您还应该使用gzip压缩图像。这样,您将需要每帧发送更少的数据。这是gzip library的文档。