python - 如何使用 Python Image Library 将 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),因此值得!
推荐阅读
- c++ - 在 C++17 中初始化整数向量的向量
- r - 为什么我的嵌套 ifelse 在 R 中无法正常工作
- google-app-engine - 将 GCP App Engine 限制为仅使用 1 个单元的 app engine flex core
- php - 如何从 HTMLpurifier 中免除标签?
- python-3.x - 无法执行脚本python exe
- javascript - Javascript 正则表达式似乎在替换中添加了反斜杠
- c++ - 如何计算文件C++中的某个字符
- javascript - Moment isValid 方法不断返回弃用警告
- r - 创建数据框列表 => 警告:在 df_list[i] <- as.data.frame(df_ex) 中:要替换的项目数不是替换长度的倍数
- python - 构建 Python 扩展失败(“kernel32.lib”无法打开 |“x64”与目标机器类型“x86”冲突)