Screenshot Pro: Annotate UI screenshots with measured coordinates and verify with 15 assertions

前言

给软件写使用手册、操作说明或流程文档时,常见做法是在截图上手工画框、标序号、写说明。框的位置一旦和真实控件对不齐,读者会误解点击区域;改分辨率或换主题后,旧图往往要整张重画。DeepSeek Harness(DSH)社区里有一类「工作流」插件,把「量坐标 → 出图 → 验图」串成可重复执行的步骤。下面介绍维护者 HtO404 发布的 screenshotpro:它强调矩形来自测量而非手调,渲染结果还要通过固定断言集,失败则非零退出。

这是什么

Screenshot Pro(npm 包名 screenshotpro,GitHub:HtO404/screenshotpro)的定位是:带标注的 UI 截图,坐标来自实测,而不是手绘估计。

仓库同时提供两种形态,彼此不依赖:

形态 内容 是否需要 DSH
独立 CLI tools/render.py、tools/verify.py(Windows 上还有 tools/measure_win.py) 否,需 Python 3.9+ 与 Pillow
DSH 插件包 名为 Screenshot Pro 的 Agent 预设,挂载本仓库 skill 与所需工具 是,任意 DSH 宿主

插件在 SkillHub 目录页分类为「工作流」:hto404/screenshotpro。

核心设计:坐标只测量,不估计

仓库贯穿一条规则:

Coordinates are measured, never estimated.

Windows 桌面场景下:你提供可执行文件,工具启动应用,用 PrintWindow 抓整窗,并导出完整 UI Automation 控件树;spec.json 只描述指向哪个控件(例如 automation_id),不写像素坐标。渲染器根据 dump 生成框体、数字徽章、箭头、像素化遮罩和底部图例;验证器用 15 项断言检查报告与 dump、PNG 是否一致,任一失败则退出码非 0。

公开网页 demo(Wikipedia、MDN)则矩形来自 live DOM 的 getBoundingClientRect,spec.json 里同样没有手填坐标。断言 3 会逐字段对照 dump;断言 8 会在框落在空白像素时失败——这正是「猜坐标」时容易出现的情况。

图上的能力包括:带 padding 的高亮框、编号圆形徽章(避免碰撞且尽量不盖住控件)、从徽章到框边的箭头、对实测矩形做 pixelate 打码,以及在截图下方追加自适应高度的图例条(画布宽度与输入截图一致,说明文字放在图例里,避免盖住正文)。

流水线阶段

阶段 独立命令 读 写 约定摘要
Measure python tools/measure_win.py --exe <app.exe> --out figures/<name> 运行中的应用(UI Automation) shot.png、dump.json、measure-log.txt dump schema 为 uia-dump/1 等
Annotate python tools/render.py figures/<name>/spec.json spec.json、shot.png、dump.json out/<name>.png、out/render-report.json spec.schema = annot-spec/1,输出宽等于输入宽
Verify python tools/verify.py figures/<name>/spec.json spec、dump、report、渲染 PNG PASS/FAIL 表 仅当 15/15 通过时 exit 0
自测 python tests/run_tests.py 内置合成 fixture 临时目录中的 fixture 与图 15/15 PASS,并含故意失败用例

典型顺序:先 render.py,再 verify.py。

安装与启用(DSH 插件)

安装命令来自仓库 README(npm registry,当前 package 版本 1.0.1,许可证 MIT):

pnpm add screenshotpro

在同一 DSH profile 目录(~/.dsh/profiles/<name>/)中:

  1. 在 package.json 的 dsh.profile.bundles 中加入 screenshotpro。
  2. 修改包内 cordis.patch.yml 中 一行 customSkillDirs:必须写成该包 skills/ 目录的绝对路径。dsh-skill-filesystem 会对数组里每一项做 path.resolve(),相对路径会相对 DSH 宿主进程 cwd 解析,且不会展开占位符。

示例(路径需改成你本机实际位置):

          - id: skill-filesystem
            name: '@deepseek-ai/dsh-skill-filesystem'
            config:
              customSkillDirs:
                - '/home/me/screenshotpro/skills'

重启 DSH 后,目录中会出现 Screenshot Pro 预设与 screenshot-pro skill。包体是 Python 源码加 YAML patch,无需编译打包。

注意: 插件以当前 DSH 进程权限运行;安装前请自行查看源码与 MIT 许可证,确认可接受再启用。

典型用法

最小可复现闭环(无需真实应用与网络)

python tools/make_fixture.py /tmp/fx
python tools/render.py       /tmp/fx/spec.json
python tools/verify.py       /tmp/fx/spec.json

第三步应输出 15 行均为 [PASS],并以 exit 0 结束(验证器会打印中文结果摘要,例如「15/15 断言通过 -> PASS」)。

spec.json 使用 schema annot-spec/1,通过 steps 里的 target(如 automation_id)和 label 描述标注步骤,可选 redact 做像素化,legend 控制底部图例。完整字段见仓库 README 的 spec 参考与 examples/minimal-spec.json。

仓库内网页 demo(离线可复现)

python tools/render.py demo/wikipedia/spec.json && python tools/verify.py demo/wikipedia/spec.json
python tools/render.py demo/mdn/spec.json       && python tools/verify.py demo/mdn/spec.json

Wikipedia 示例含四步标注与账号区域打码;MDN 示例含三步标注与第三方广告条打码,并可选用 style.badge_avoid_dense_pixels(详见 demo/README.md)。

Windows 桌面应用

对真实 .exe 先测量再渲染、验证:

python tools/measure_win.py --exe <app.exe> --out figures/<name>
python tools/render.py figures/<name>/spec.json
python tools/verify.py figures/<name>/spec.json

测量与 measure_win.py 依赖 Windows 与 UI Automation;在 DSH 会话里由 Screenshot Pro 预设挂载的 skill 与工具,目的是在同一工作流里编排上述步骤,而不是替代 Python 环境依赖。

适用场景与限制

适合:需要可验证的 UI 说明图——使用手册、操作说明、流程文档、工具功能演示等;希望框、箭头、图例与实测控件一致,并能在 CI 或脚本里用 exit 码卡质量。

需知:measure_win.py 面向 Windows 可执行程序;网页 demo 走的是已提交的 shot/dump 与 DOM 测量流程,与 WinForms 等桌面路径不同。独立 CLI 不装 DSH 也能用;装 DSH 插件是为了在 Agent 预设里直接使用 skill 与配套工具。

SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系;选插件时以仓库 README 与源码为准。

结尾

Screenshot Pro 把「测量 → 标注渲染 → 15 项断言验证」做成一条可重复流水线,避免手调坐标带来的文档漂移。进一步细节、断言列表与 spec.json 字段说明见 GitHub 仓库(含 README.zh-CN.md);目录入口见 SkillHub 插件页。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye