对于上下文,我有一个 PyQt5 小部件,带有一个按钮,让我选择要捕获的屏幕区域。我可以使用
pillow
和 mss
来捕获 X11 上的内容,就像这样
def take_screenshot(self, x1, y1, x2, y2):
with mss.mss() as sct:
monitor = {"top": y1, "left": x1, "width": x2 - x1, "height": y2 - y1}
sct_img = sct.grab(monitor)
img = Image.frombytes("RGB", sct_img.size, sct_img.bgra, "raw", "BGRX")
img.save("screenshot.png")
print("Screenshot saved as screenshot.png")
但是在 Wayland 上尝试时,我收到一个关于
XGetImage()
的错误
mss.exception.ScreenShotError: XGetImage() failed
我也尝试过这样做
def take_screenshot(self, x1, y1, x2, y2):
# Ensure x1 < x2 and y1 < y2
x1, x2 = min(x1, x2), max(x1, x2)
y1, y2 = min(y1, y2), max(y1, y2)
screen = QApplication.primaryScreen()
screenshot = screen.grabWindow(0, x1, y1, x2 - x1, y2 - y1)
screenshot.save("screenshot.png", "png")
print("Screenshot saved as screenshot.png")
但这只会导致黑屏捕获,据我所知,这是因为 Wayland 具有安全功能,可以明确防止从一个窗口捕获内容到下一个窗口
有一些我可以使用的Python 库吗?作为最终解决方案,我可以使用
gnome-screenshot
或一些类似物从子流程中截取屏幕截图,但我想让事情尽可能简单