Genymobile/screen-ruler
GitHub: Genymobile/screen-ruler
一款基于边缘检测的智能屏幕标尺,鼠标悬停即可实时测量任意 UI 元素的宽高像素值。
Stars: 2 | Forks: 1
# screen-ruler
一款适用于 Linux 桌面的智能、基于边缘检测的屏幕标尺。
将鼠标光标移动到任何 UI 元素上,即可即时读取最近边缘之间的**宽度**和**高度**——无论是按钮、面板、窗口还是图标——无需点击或拖拽。
## 工作原理
启动时,screen-ruler 会进行一次性的屏幕截图,并使用 Canny 边缘检测构建二值边缘图(通过 OpenCV 高斯预模糊来抑制字体抗锯齿和壁纸噪点)。随后会在所有显示器上显示一个透明覆盖层。在每一帧中,从鼠标光标向四个方向(北 / 南 / 东 / 西)发射射线,直到它们碰到边缘像素或屏幕边界。东西方向的总距离将作为 **W** 报告,南北方向的总距离作为 **H** 报告,并实时显示在光标旁边的一个小标签中。
## 依赖项
| 包名 | 最低版本 |
|---|---|
| [PyQt6](https://pypi.org/project/PyQt6/) | 6.2 |
| [NumPy](https://pypi.org/project/numpy/) | 1.21 |
| [opencv-python-headless](https://pypi.org/project/opencv-python-headless/) | 4.5 |
一次性安装所有依赖项:
```
pip install -r requirements.txt
```
## 使用方法
```
python screen_ruler.py [--threshold-low N] [--threshold-high N] [--debug-edge-overlay]
```
| 选项 | 默认值 | 描述 |
|---|---|---|
| `--threshold-low N` | 29 | Canny 边缘检测器的低滞后阈值 |
| `--threshold-high N` | 101 | Canny 边缘检测器的高滞后阈值 |
| `--debug-edge-overlay` | off | 保持捕获的 Canny 边缘图可见(基础透明度)以便调试;滑动滑块也会触发短暂的边缘预览 |
**控制方式**
| 输入 | 动作 |
|---|---|
| `1` / `2` / `3` | 切换测量模式 |
| `Ctrl+C` | 将当前测量结果复制到剪贴板,然后退出 |
| `?` 或 `H` | 切换快捷键帮助覆盖层的显示 |
| `Escape` 或 `Q` | 退出 |
| 左键点击 | 将当前测量结果作为 `W × H px` 复制到剪贴板,然后退出 |
| 顶部 `Sensitivity` 滑块 | 实时重新计算边缘检测(防抖)并短暂显示边缘图预览(先保持显示然后淡出) |
启动时,会短暂显示一个轻量级的快捷键覆盖层并自动淡出;随时按 `?` 或 `H` 键可将其重新调出。
## 构建独立可执行文件
如果你不想安装 Python 环境,可以使用 [PyInstaller](https://pyinstaller.org) 构建一个独立的单文件二进制程序:
```
pip install -r requirements.txt -r requirements-build.txt
pyinstaller screen_ruler.spec
```
二进制文件将输出到 `dist/screen-ruler`。你可以将其复制到任何位置并直接运行——目标机器上无需安装 Python 或任何库。
## 全局键盘快捷键
Screen Ruler 的设计理念是即开即用——捕获、测量、退出。全局键盘快捷键可以让你无需常驻后台 daemon 即可瞬间召唤它。
### Linux
构建二进制文件后,运行安装脚本:
```
./install-linux.sh # installs to the current directory
./install-linux.sh -d ~/bin # or specify a directory
```
该脚本会复制二进制文件,安装一个 `.desktop` 条目,并自动为检测到的桌面环境(GNOME、KDE Plasma、Hyprland、Sway)注册 **Super+Shift+R** 快捷键。
### macOS
构建二进制文件后,运行安装脚本:
```
./install-macos.sh # installs to the current directory
./install-macos.sh -d ~/bin # or specify a directory
```
该脚本会复制二进制文件并创建一个 Automator 快速操作(“Launch Screen Ruler”)。然后前往 **系统设置 → 键盘 → 键盘快捷键 → 服务** 中绑定快捷键(例如 **⌘⇧R**)。
### Windows
构建可执行文件后,在 PowerShell 中运行安装脚本:
```
.\install-windows.ps1 # installs to the current directory
.\install-windows.ps1 -InstallDir "$env:LOCALAPPDATA\screen-ruler" # or specify a directory
```
该脚本会复制二进制文件,将其添加到用户的 `PATH` 中,并创建一个带有 **Ctrl+Shift+R** 热键的开始菜单快捷方式。
如需在任何平台上进行手动设置,请参阅 [docs/manual-shortcut-setup.md](docs/manual-shortcut-setup.md)。
## 故障排除
### X11 下覆盖层相对于顶部/侧边栏的偏移
在某些 X11 窗口管理器中,无框工具窗口会被限制在桌面工作区内(不包括面板/dock)。screen-ruler 在 X11 上使用了 `Qt.X11BypassWindowManagerHint`,因此覆盖层能够与用于捕获和测量的完整虚拟桌面坐标相匹配。
由于绕过窗口管理器的窗口在焦点行为上可能较难预测,该应用还额外安装了应用级别的 `Escape`/`Q` 按键作为备用退出方式。
### `qt.qpa.theme.gnome: dbus reply error ... NoReply`
在某些 GNOME/X11 系统上,Qt 在启动期间通过 DBus 探测桌面主题服务时可能会打印此警告。在大多数情况下,它是无害的,并且不会影响标尺的功能。
如果该警告反复出现,请检查你的会话 DBus 和 portal 服务(`dbus-daemon`、`xdg-desktop-portal`)是否正常运行。
## 贡献
1. 安装开发依赖项(与运行时依赖相同,另外加上 `pytest`):
pip install -r requirements-dev.txt
2. 从代码库根目录运行测试套件:
pytest tests/
3. 纯逻辑辅助函数(`trace_ray`、`compute_edge_map`)是模块级函数,专门用于在没有显示器的情况下进行测试。尽可能以相同的风格编写新逻辑。
4. QML 覆盖层(`screen_ruler.qml`)和屏幕捕获代码需要运行中的 Qt 应用程序,因此不包含在单元测试范围内。
## 许可证
本项目基于 MIT 许可证授权。有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
标签:OpenCV, PyQt6, Python, 屏幕尺, 无后门, 桌面工具, 漏洞挖掘, 边缘检测, 逆向工具