如何使用Python图像库将libvirt流转换为不同的图像类型?



执行下面的示例代码,效果很好:

​import sys
​import libvirt
​domName = 'TestAppliance'
​conn = None
​try:
​    conn = libvirt.open("qemu:///system")
​except libvirt.libvirtError as e:
​    print(repr(e), file=sys.stderr)
​    exit(1)
​
​dom = None
​try:
​    dom = conn.lookupByName(domName)
​except libvirt.libvirtError as e:
​    print(repr(e), file=sys.stderr)
​    exit(1)
​
​stream = conn.newStream()
​imageType = domain.screenshot(stream,0)
​file = "Screenshot of " + dom.name()
​fileHandler = open(file, ’wb’)
​streamBytes = stream.recv(262120)
​
​while streamBytes != b’’:
​    fileHandler.write(streamBytes)
​    streamBytes = stream.recv(262120)
​fileHandler.close()
​print(’Screenshot saved as type: ’ + imageType)
​stream.finish()
​conn.close()
​exit(0)

(https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/ch12s02.html)但是,这会生成一个. ppm图像,大小约为3.5mb。

我如何使用python流在PIL中推送PPM图像,以便PIL可以将其转换为(较小的).PNG(或其他格式)?

我知道我可以保存它,并转换它,但这似乎是…倒退。

我做了更多的研究,得到了答案。打开连接并找到您的VM后,使用以下命令截取屏幕截图,并将其保存为PNG格式:

vstream = conn.newStream() 
imageType = dom.screenshot(vstream, 0)
file = dom.UUIDString() + '.png'
bstream = vstream.recv(8192)
pyStream = BytesIO()
while bstream != b'':
pyStream.write(bstream)
bstream = vstream.recv(8192)
pyStream.seek(0)
image = Image.open(pyStream)
image.save(file, 'PNG')
pyStream.close()
print('PNG saved from '+str(imageType))
vstream.finish()

大小差异是9.1k (PNG)和3.2mb (PPM),所以值得!