pyautogui.screenshot() 截图变黑或不完整是因系统权限/会话限制:windows需交互式用户运行,macos需开启屏幕录制权限并勾选python,linux需display环境变量和x server;多图拼接应手动创建画布再paste;png体积大可加optimize=true;鼠标光标需自行叠加绘制。

截全屏后图像变黑或内容不完整?检查 pyautogui.screenshot() 的执行环境
在无桌面会话的 Linux 服务器、Windows 远程桌面断开连接、或 macOS 启用“屏幕录制”权限但未勾选对应应用时,pyautogui.screenshot() 常返回纯黑图或只截到登录界面。这不是代码 bug,而是系统级限制。
实操建议:
- Windows:确保以交互式用户身份运行(不要通过
services.exe或计划任务“不显示桌面”模式启动) - macOS:打开“系统设置 → 隐私与安全性 → 屏幕录制”,确认 Python 解释器(如
python3或PyCharm)已勾选 - Linux(X11):避免在
ssh会话中直接调用,改用DISPLAY=:0 python script.py并确保 X server 正在运行 - 临时验证:加一行
print(pyautogui.screenshot().getpixel((10,10))),若输出(0, 0, 0)且非预期,基本可判定是权限/会话问题
想把多张截图拼成长图?用 PIL.Image.new() 手动合成比直接粘贴更可控
直接用 paste() 叠加容易因坐标错位、尺寸不齐导致白边或重叠。手动创建目标画布再逐张粘贴,能统一处理缩放、对齐和间隔。
示例关键逻辑:
from PIL import Image
screenshots = [Image.open("s1.png"), Image.open("s2.png")]
total_height = sum(img.height for img in screenshots)
width = max(img.width for img in screenshots)
merged = Image.new("RGB", (width, total_height), "white")
y_offset = 0
for img in screenshots:
merged.paste(img, (0, y_offset))
y_offset += img.height
注意点:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
Image.new()第三个参数设为"white"或(255,255,255),避免默认黑色背景干扰视觉 - 务必用
max(img.width)而非首张图宽度,防止右侧被裁剪 - 若需添加分隔线,可在每次
paste()后用ImageDraw.Draw(merged).line(...)
截图保存为 PNG 却体积暴涨?关掉 PIL 默认的无损压缩冗余
screenshot().save("out.png") 默认使用最高质量无损压缩,对纯色区域(如桌面背景)反而生成更大文件。实际场景中多数无需保留全部 1677 万色精度。
优化方式:
- 转为 RGB 模式再保存:
img.convert("RGB").save("out.png", optimize=True) - 若接受轻微压缩,加
quality=95参数(仅对 JPEG 有效;PNG 不支持 quality,但optimize=True已显著减小体积) - 批量处理时,用
img.quantize(colors=256)降色(适合含大量图标/文字的截图),再存 PNG - 对比测试:一张 1920×1080 截图,原始 PNG 约 2.1 MB,加
optimize=True后常降至 1.3 MB 以下
需要带鼠标光标?pyautogui.screenshot() 本身不捕获,得自己叠加绘制
pyautogui.screenshot() 返回的是系统窗口快照,不包含鼠标指针——这是跨平台一致行为,不是遗漏功能。
补救方案:
- 用
pyautogui.position()获取当前坐标,再用PIL.ImageDraw.Draw(img).ellipse(...)画个红圈模拟 - 更真实的做法:准备一个鼠标光标 PNG(透明背景,尺寸约 32×32),用
img.paste(cursor_img, pos, cursor_img)叠加,第三个参数传自身作 mask - 注意坐标偏移:操作系统通常把光标热点(hotspot)设在左上角或中心,叠加前需根据光标图调整
pos,例如(x-8, y-8)对应 16×16 热点居中 - 别忘了检查光标是否在屏幕外:
x, y = pyautogui.position(); if 0
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










