开始的时候由于没有搭建好环境,一直报错。
vboxapi官方是全英文文档有点看不懂。研究了一天终于研究出来了。
官方sdk地址http://download.virtualbox.org/virtualbox/SDKRef.pdf
vboxapi 这个库可以用pip install vboxapi 进行安装。
如果要对虚拟机进行管理则比较麻烦。需要先建立一个session,然后锁住这个线程。
这块我可能是还没有搞明白。不过截图搞明白了。
import vboxapi
from PIL import Image
import io
# 创建VirtualBoxManager对象
vbox_manager = vboxapi.VirtualBoxManager(None, None)
# 获取VirtualBox对象
virtualbox = vbox_manager.getVirtualBox()
# 根据虚拟机名称查找虚拟机对象
machine_name = "monterey"
machine = virtualbox.findMachine(machine_name)
# 获取当前虚拟机的会话对象
session = vbox_manager.getSessionObject()
# 'LockType_Shared': 1,
# 'LockType_Write': 2,
machine_lock = machine.lockMachine(session, 1)
display = console.display
screenshot_path = "screenshot.png"
# 'BitmapFormat': {
# 'Opaque': 0,
# 'BGR': 0x20524742,
# 'BGR0': 0x30524742,
# 'BGRA': 0x41524742,
# 'RGBA': 0x41424752,
# 'PNG': 0x20474E50,
# 'JPEG': 0x4745504A,
# },
png_data = display.takeScreenShotToArray(0,800, 600, 0x41424752)
# 调用 takeScreenShotToArray 获取屏幕截图的字节数组 data
# 将字节数组转换为 PIL Image 对象
img = Image.frombytes('RGBA', (800, 600), bytes(png_data))
# 保存为 PNG 格式的文件
with open('screenshot.png', 'wb') as f:
img.save(f, format='PNG')
# 关闭虚拟机会话
session.unlockMachine()
为什么开发这个截图功能?
官方的vboxmanger是可以截图,但是会增加i/o的输入输出。这个可以直接把截图保存在变量里面。不需要i/o读写。方便我做网页管理器。