优先用 from PIL import ImageGrab + ImageGrab.grab(bbox=None);Linux需装x11-utils,pyautogui.screenshot() 已不推荐,Wayland下默认失败且HiDPI支持差。

截图用 screenshot() 还是 ImageGrab.grab()?
直接调用 Pillow 的 ImageGrab.grab() 最简单,不用额外装驱动或依赖系统工具。Windows/macOS/Linux 都支持,但 Linux 下需提前装 x11-utils(Ubuntu/Debian 执行 sudo apt install x11-utils)。screenshot() 是旧版 pyautogui 提供的,现在已不推荐——它底层仍调用 ImageGrab,但多一层封装,出错时堆栈更难定位。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先用
from PIL import ImageGrab+ImageGrab.grab(bbox=None) - 需要截特定区域时传
bbox=(x1, y1, x2, y2),注意坐标系原点在左上角,x2和y2是右下角坐标(不包含),不是宽高 - 避免用
pyautogui.screenshot()—— 它在 Wayland 环境下默认失败,且对 HiDPI 屏幕缩放处理不稳定
pytesseract.image_to_string() 识别失败的常见原因
90% 的识别失败不是 OCR 引擎问题,而是输入图像质量或配置不匹配。Tesseract 默认按“自动页面分割模式”(psm=3)处理,但截图常含噪点、低对比度、小字号或非标准字体。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先用
img = img.convert('L').point(lambda x: 0 if x 转为二值图,比直接传灰度图更稳定 - 显式指定
psm:单行文字用psm=7,段落用psm=6,纯数字用psm=8 - 中文必须加
lang='chi_sim'(简体)或lang='chi_tra'(繁体),且确保本地已安装对应语言包(路径通常为/usr/share/tesseract-ocr/4.0/tessdata/或C:\Program Files\Tesseract-OCR\tessdata\) - 若返回空字符串,先
img.save('debug.png')保存截图检查——经常发现是截图区域为空、窗口被遮挡、或字体太细导致二值化后字迹断裂
中文识别准确率低?别只怪 Tesseract
Tesseract 对中文字体的泛化能力弱于英文,尤其遇到微软雅黑、苹方、思源黑体等无衬线字体,或字号小于 12px 时,字符粘连、笔画丢失很常见。这不是参数能完全解决的问题。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 截图前手动放大目标区域(比如浏览器按
Ctrl +),让文字物理像素变大再截 - 用
img.resize((img.width * 2, img.height * 2), Image.LANCZOS)双线性插值放大,比默认的最近邻插值保留更多结构信息 - 避免使用
psm=1(自动检测所有内容)——中文混排表格或图标时极易误判成乱码;固定psm=6并配合裁剪更可控 - 如果目标是识别固定位置的 UI 文字(如按钮、状态栏),用模板匹配预定位区域,再送进 OCR,比全屏扫效率高、容错强
为什么本地跑通了,打包成 exe 就报 TesseractNotFoundError?
pytesseract 默认从环境变量 TESSERACT_CMD 或硬编码路径找 tesseract 可执行文件。PyInstaller 打包时不会自动把 tesseract 二进制打进 exe,也不会设置环境变量。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- Windows 下最稳方案:把
tesseract.exe和整个tessdata文件夹和你的 exe 放同一目录,然后启动时加pytesseract.pytesseract.tesseract_cmd = './tesseract.exe' - 不要用
shutil.which('tesseract')动态查找——打包后系统 PATH 里根本没这个命令 - macOS/Linux 用户打包时,要么静态链接 tesseract(复杂),要么明确要求用户自行安装,并在代码里用
os.path.exists()检查/usr/local/bin/tesseract或/opt/homebrew/bin/tesseract - 中文语言包必须随程序分发:
chi_sim.traineddata文件不能只靠用户本地安装,要一起打进资源目录并用config='--tessdata-dir "./tessdata/"'指定
真正麻烦的从来不是调 API,而是让 OCR 在不同机器、不同 DPI、不同缩放比例、不同字体渲染引擎下都给出可预期的结果。截图坐标、图像预处理、语言包路径这三处,漏掉任何一个都会让整条链路静默失败。


















