专业接各种小工具软件及爬虫软件开发,联系Q:2391047879

Python屏幕截图工具(PIL库实现)

发布时间: 2025-08-27 16:12:01 浏览量: 本文共包含615个文字,预计阅读时间2分钟

办公室的玻璃幕墙透进正午阳光时,我正对着满屏代码发愁——客户需要个能自定义截图范围的工具,但市面软件总有各种限制。掏出Python三件套,发现PIL库的ImageGrab模块藏着惊喜,于是有了这个自研截图方案。

环境搭建藏着坑

安装PIL库时记得用`pip install pillow`,原版库早在2011年就停止更新。碰到"ImportError: No module named 'PIL'"报错别慌,八成是装错了包名。Windows系统自带支持,Linux用户得先装`python3-tk`,否则ImageGrab会罢工。

区域截图的坐标系玄机

用`bbox`参数划定截图范围时,注意坐标系原点在屏幕左上角。实测发现某些显示器存在像素偏移,这时候得用校准代码:

```python

from PIL import ImageGrab

test_area = (100, 100, 500, 300)

ImageGrab.grab(bbox=test_area).show

```

运行后若发现截图区域偏差,适当加减10-20像素调整。双屏用户要小心,主副显示器坐标是连续计算的。

全屏截图的暗门

不加bbox参数直接grab确实能截全屏,但某些游戏窗口会截到黑屏。这时候祭出`all_screens=True`参数,配合`ImageGrab.grab`能抓取所有显示器画面。测试时发现多屏系统截图会横向拼接,需要自行切割处理。

GUI封装实战技巧

用tkinter做界面时,鼠标拖拽选取区域是个技术活。Canvas组件要绑定``和``事件记录坐标。有个细节容易翻车:截图前必须销毁窗口,否则截屏会包含当前GUI界面。建议用`root.withdraw`隐藏窗口再截图。

异常处理必修课

当用户选取的右边界小于左边界时,PIL不会报错但会返回空图像。解决方法是在执行grab前做数值交换:

```python

left, right = sorted([x_start, x_end])

top, bottom = sorted([y_start, y_end])

```

加上try-except块捕捉权限异常,特别是macOS系统需要授权截图权限。

截图文件命名推荐用时间戳+随机字符串,避免覆盖问题。存储格式建议优先png,jpg格式截图文字时会产生噪点。最后留个开发彩蛋——在截图角落添加半透明水印,用Image模块的alpha_composite就能实现。