传统截图工具通常让你在“手动框选”和“调用桌面环境原生选择器”之间二选一。Babry 走第三条路:截取整屏后,用本地 CV 结合边缘、色差和布局分析候选区域,在鼠标悬停时给出选区。
你可以:
- 悬停就吸附到窗口、面板、卡片或控件;
- 滚轮换层级,在控件、面板、窗口和全屏之间切换;
- 单击就确认,不需要反复调整边框;
- 拖动就精修,任何时候都能切换为像素级手动框选;
- 在同一个界面完成标注、文字、复制、保存和贴图。
Note
Babry 当前支持 Linux Wayland 下的 niri、Hyprland 和 KDE Plasma 6.8+。CV 选区使用 Rust 的 imageproc 内置实现,不依赖 slurp、选区 IPC 或系统 OpenCV 动态库。
悬停目标区域时,Babry 会显示候选框、尺寸和四角控制点;进入编辑后,选区外区域自动变暗,视觉焦点留在需要保存的内容上。
文字工具参考 PixPin 的输入体验:点击画布后直接输入,文字显示在原位置;字号和颜色在工具栏实时调整,输入效果与最终导出保持一致。
工具栏提供矩形/圆形/方形、画笔、文字、递增数字标注、马赛克/高斯模糊、橡皮擦、荧光笔、撤销/重做、贴图、保存和复制。形状和效果可从右侧箭头打开菜单切换,左侧点阵用于拖动工具栏。
| 能力 | 体验 |
|---|---|
| CV 智能选区 | 自适应边缘、颜色边界、背景连通域与长直线分析;质量评分、原图边界精修、滚轮切换层级 |
| 全屏截图 | grim(niri/Hyprland)或 KWin 截屏接口(KDE Plasma 6.8+)获取当前 Wayland 桌面,--screen 直接进入编辑 |
| 标注工具 | 画笔、矩形/圆形/方形、圈号递增数字标注、橡皮擦和半透明荧光笔 |
| 隐私处理 | 局部马赛克与连续轨迹模糊,可调节模糊度 |
| 原位文字 | 直接在画布输入,多行换行;字号、字体和颜色与导出同步 |
| 工作流 | 实时预览、撤销/重做、保存 PNG、复制到剪贴板、Wayland 贴图 |
| 轻依赖 | Rust + Slint + imageproc;KDE 后端使用纯 Rust 的 zbus,不要求系统 OpenCV、slurp 或 niri 选区命令 |
Arch Linux 及其衍生发行版用户可以通过 AUR 安装二进制包 babry-bin,无需本地编译 Rust:
yay -S babry-bin
# 或
paru -S babry-bin如果已配置提供 babry-bin 的二进制软件仓库,也可以使用:
sudo pacman -S babry-binpacman 不直接从 AUR 安装软件;仅使用 AUR 时,请选择上面的 yay 或 paru 命令。
从源码构建
安装 Rust 工具链及对应发行版的构建依赖后执行:
git clone https://github.com/kregonia/babry.git
cd babry
cargo build --release --locked生成的二进制文件为 target/release/babry。将它放入 PATH:
install -Dm755 target/release/babry ~/.local/bin/babry截图在 niri/Hyprland 上需要 grim;KDE Plasma 6.8+ 直接调用 KWin 自带的 org.kde.KWin.ScreenShot2,无需额外安装。复制图片需要 wl-clipboard;可选的 notify-send 用于状态通知。AUR 包已声明 Fontconfig、xkbcommon 和 Wayland 系统库依赖,截图和剪贴板工具请按需安装。
Arch Linux:
# niri / Hyprland
yay -S grim wl-clipboard libnotify
# KDE Plasma 6.8+(无需 grim)
yay -S wl-clipboard libnotifybabry # CV 智能区域截图:悬停吸附,单击确认
babry --smart # 同上,显式使用智能选区
babry --screen # 截取全屏并直接进入编辑
babry --pin image.png # 将已有 PNG 作为屏幕贴图
babry --output DP-1 --screen # 指定显示器截图
babry --list-outputs # 列出当前会话的显示器信息
babry --help # 查看完整帮助--window 和 -w 仍作为兼容别名保留,但现在使用 Babry 自己的 CV 选区,不调用 niri msg。
未配置时,图片保存到 XDG_PICTURES_DIR 环境变量指定的目录,否则使用 ~/Pictures;没有 HOME 时使用当前目录。文件名为 babry-年月日-时分秒-毫秒.png。保存、复制和贴图都会先在此目录生成 PNG。
持久设置可写入 ~/.config/babry/config.toml;设置了 XDG_CONFIG_HOME 时,改用 $XDG_CONFIG_HOME/babry/config.toml。示例见 config.example.toml:
save_dir = "~/Pictures/Screenshots"单次指定或通过环境变量覆盖:
babry --save-dir ~/Pictures/Work
babry --screen --save-dir "/mnt/data/我的截图"
babry --standalone --output DP-1 --save-dir ./screenshots
BABRY_SAVE_DIR=~/Pictures/Babry babry优先级为 --save-dir → BABRY_SAVE_DIR → 配置文件 save_dir → XDG_PICTURES_DIR → ~/Pictures。配置值支持 ~/、$HOME/、${HOME}/;配置中的相对路径以配置文件所在目录为基准,命令行和环境变量中的相对路径以本次调用的工作目录为基准。目录只在实际导出时创建;创建或写入失败会报告错误并保留编辑窗口。
后台模式每次截图由调用端重新读取配置并传递保存目录,修改配置无需重启后台,临时 --save-dir 不会改变后续截图的默认目录。配置文件不会自动创建或覆盖。
在图形会话中先启动一次后台:
babry --daemon该命令在前台运行,可由合成器管理。后台启动后,原有的 babry、babry --screen 和 --output NAME 截图命令会通过当前 Wayland 会话的 Unix socket 唤起它,无需修改截图快捷键。每次请求都会获取新截图;已有截图正在选择或编辑时,重复请求会提示忙碌,不覆盖当前内容。保存、复制、贴图、取消或关闭编辑窗口后,后台释放该次截图、标注历史和 CV 候选,继续等待。Pin 仍运行在独立进程中。
babry --daemon-status # 查看当前会话的后台状态
babry --stop-daemon # 退出后台(同时关闭尚未完成的编辑窗口)
babry --standalone # 本次跳过后台,截图结束后退出
babry --standalone --screen # 独立全屏截图,可继续组合 --output后台未运行时,普通截图命令自动按独立模式执行,不强制常驻。后台模式下,命令返回表示截图请求已接收;后续截图失败通过通知和后台 stderr 报告。
niri 可在配置顶层加入:
spawn-at-startup "babry" "--daemon"Hyprland 可加入:
exec-once = babry --daemon常驻会保留 Slint 运行时、字体和部分系统/图形缓存,交换更低的唤起延迟。它不在空闲时循环截图或轮询鼠标,也不保存上一帧供下一次使用。Wayland 隐藏编辑窗口时,Slint 会销毁其原生窗口和图形上下文,后台不保证永久保留 GPU 资源。内存较少、截图较少时可以使用独立模式。
- 移动鼠标:从已缓存的候选中选择边界可靠的区域,微小移动保持当前框。
- 滚轮向上:扩大到父区域;向下:缩小到鼠标所在的子区域。
- 单击:确认当前候选,包括滚轮选择的层级,进入编辑阶段。
- 按住拖动:移动超过 3px 后切换为手动框选;松开后确认区域。
- 选区边框或角点:在选区阶段也可以直接拖动调整边界,悬停时显示对应缩放光标。
Esc:取消截图。
CV 分析在每次截图时由后台线程执行一次,悬停不会重新处理整张图像;等待期间可以直接拖动框选。选区评分优先考虑方向边界的连续性,降低文字碎片和不规则纹理的优先级;高分屏候选会在原始截图上精修边界。
- 默认状态:确认选区或使用
--screen后,标注工具均不选中,拖动选区内部整体平移。 - 工具切换:点击工具启用对应标注;再次点击同一工具取消选择并恢复选区移动。工具栏没有额外的“编辑”“移动”按钮。
- 调整大小:四个角点和四条边始终可以拖动调整选区,任何工具状态均有效;悬停显示横向、纵向或对角缩放光标。
- 移动工具栏:按住最左侧点阵并拖动,只改变工具栏位置,不改变选区或当前工具。
- 形状:矩形右侧下拉可切换矩形、圆形和方形;圆形/方形保持像素宽高一致。
- 粗细:画笔等工具下方的滑块和数字输入框共用 1~64px 粗细值。
- 数字标注:点击选区添加圈 1、圈 2……;撤销和重做同步恢复编号。
- 橡皮擦:沿笔迹还原原截图像素,擦除也支持撤销/重做。
- 隐私效果:马赛克右侧下拉可切换高斯模糊。
- 预留功能:更多入口暂空;折线以及尚未实现的长截图、录屏、OCR、翻译不显示在工具栏。
- 文字:选择
字工具,在选区内点击即可原位输入。 - 确认文字:点击画布外、切换工具或按
Ctrl+Enter。 - 取消文字:
Esc;未输入文字时,先取消当前绘制或选中工具,再次按Esc关闭截图。 - 字号/颜色:输入过程中也可以从工具栏实时修改;颜色圆点旁的彩虹按钮可展开默认色盘,选择更多彩色、灰阶和常用预设色。
- 历史:
Ctrl+Z撤销,Ctrl+Shift+Z或Ctrl+Y重做。 - 导出:
Ctrl+S保存,Ctrl+C复制,工具栏上的图钉用于贴图。
通过工具栏的贴图按钮,Babry 会把当前选区导出后以 Wayland layer-shell Top layer 显示:
- 左键拖动:移动贴图
- 滚轮:缩放贴图
- 右键:关闭贴图
Esc:关闭获得焦点的贴图
Babry 会根据 XDG_CURRENT_DESKTOP 与合成器环境变量(NIRI_SOCKET、HYPRLAND_INSTANCE_SIGNATURE、KDE_FULL_SESSION)选择 niri、Hyprland 或 KDE Plasma 6.8+,读取每个显示器的名称、逻辑位置、逻辑尺寸和缩放比例。
babry --list-outputs
babry --output DP-1 --screen
babry --output DP-1 --pin image.png--output NAME 可以与截图或贴图命令组合。niri 使用 niri msg -j outputs,Hyprland 使用 hyprctl -j monitors;Hyprland 的物理尺寸会按缩放比例和旋转转换为逻辑尺寸。KDE 上输出信息通过 Wayland xdg_output 读取,分数缩放由当前 mode 的物理尺寸除以逻辑尺寸推导(KWin 的 wl_output.scale 是向上取整的整数),焦点显示器通过 org.kde.KWin.activeOutputName() 查询。默认启动会先确定焦点显示器,再只截取该屏幕:niri/Hyprland 调用 grim -o NAME,KDE 调用 KWin 的 org.kde.KWin.ScreenShot2 D-Bus 接口(返回原始像素,不经过 XDG Portal;Plasma 6.8 起无需额外桌面文件声明)。无法获取焦点时使用第一个启用的显示器;niri/Hyprland 的 IPC 查询失败会报告错误,KDE 的焦点查询失败会记录警告并回退到第一个输出。指定不存在的显示器会报错。
当前截图按指定显示器单独捕获,贴图初始尺寸也按目标显示器的逻辑尺寸和缩放计算。跨显示器拖动、把同一张贴图动态迁移到另一块输出,以及不同输出间的实时 layer-shell 重绑定仍在完善中。
- 截图走 KWin 自带的
org.kde.KWin.ScreenShot2(Spectacle 同款),无需安装grim。 - 编辑器窗口在 KDE 上全屏覆盖桌面(含面板);niri/Hyprland 的全屏行为保持不变,继续使用各自窗口规则。
- Plasma 6.8 之前的 ScreenShot2 需要桌面文件声明
X-KDE-DBUS-Restricted-Interfaces,Babry 暂不支持这些版本。 - 窗口创建瞬间任务栏可能闪现一帧条目,Alt+Tab 中也可能可见;这是 KWin 在窗口 map 与全屏生效之间的行为,不影响截图。
- KWin 在锁屏/熄屏期间返回黑帧,属安全行为,与 XDG Portal 一致。
Babry 不依赖 niri 来完成选区,但可以用 niri 的窗口规则让编辑器以全屏方式显示。将以下内容放入你的规则文件:
window-rule {
match app-id=r#"^babry$"#
open-fullscreen true
open-focused true
}修改后重新加载:
niri msg action load-config-file推荐快捷键:
binds {
Mod+Shift+S { spawn "babry"; }
Mod+Shift+F { spawn "babry" "--screen"; }
}文字标注会优先使用 BABRY_FONT 指定的字体,并尝试系统中文字体。适合中文环境的示例:
export BABRY_FONT=/usr/share/fonts/wenquanyi/wqy-zenhei/wqy-zenhei.ttc
export BABRY_FONT_INDEX=0
babryTrueType Collection(.ttc)可以通过 BABRY_FONT_INDEX 选择字体索引。输入阶段和导出阶段使用同一字体来源,减少“输入时一种字体、保存后另一种字体”的偏差。
Wayland 桌面
│
▼
grim(niri/Hyprland)或 KWin ScreenShot2(KDE Plasma 6.8+)
│
▼
内存原图(PPM 管道 / 原始像素)
│
▼
imageproc CV 检测器
│
▼
Slint 选区交互层
│
▼
Slint 标注编辑器
│ │ │
▼ ▼ ▼
PNG 保存 剪贴板 layer-shell 贴图
src/
├── capture.rs # 通知与剪贴板
├── cli.rs # 命令解析与帮助文本
├── compositor.rs # 合成器策略接口、后端检测与显示器选择
├── compositor/
│ ├── grim.rs # grim PPM 管道(niri/Hyprland)
│ ├── hyprland.rs # Hyprland 输出枚举
│ ├── kde.rs # KDE Plasma 6.8+:KWin ScreenShot2 与输出枚举
│ └── niri.rs # niri 输出枚举
├── config.rs # 保存目录配置、路径展开与导出文件名
├── daemon.rs # 会话 Unix socket、实例锁和后台协议
├── startup.rs # 启动阶段计时与后台空闲内存回收
├── core/
│ ├── geometry.rs # 像素几何与归一化坐标
│ └── history.rs # 撤销/重做历史
├── editor.rs # 标注模型、局部渲染、字体与导出
├── document.rs # 按需编辑画布、历史和局部预览
├── controller.rs # Slint 回调、帧合并和资源生命周期
├── pin.rs # Wayland layer-shell 贴图
├── selection.rs # 候选查询、父子层级与悬停状态
├── selection/
│ ├── detection.rs # 多线索 CV 分析与原图边界精修
│ ├── diagnostics.rs # 候选可视化与评分 JSON
│ └── tests.rs # 弱边界、文字噪声、高分屏及真实截图回归
├── lib.rs # 库模块导出
└── main.rs # 应用启动和工作流
ui/
├── app.slint # 选区、输入、工具切换与菜单浮层
├── toolbar.slint # 可拖动工具栏、下拉入口和数值参数
└── static/ # 工具栏 SVG 图标
常用验证命令:
cargo fmt --all
cargo check --locked
cargo test --all-targets
cargo clippy --all-targets -- -D warnings
cargo build --release --locked当前测试覆盖 CLI、几何、历史、编辑渲染、字体文字导出、局部画布、撤销重做、贴图尺寸与拖动位移,以及弱边界、等亮度色块、圆角、密集文字和 4K 小控件的 CV 回归;合成器后端覆盖 niri/Hyprland JSON 解析、KDE raw 像素解包、分数缩放推导和会话检测。界面事件测试验证滚轮层级切换、单击确认、手动拖框和局部图像生命周期。
交互截图在 niri/Hyprland 上使用 grim -t ppm -o NAME - 管道,在 KDE 上使用 ScreenShot2 返回的原始像素,二者都直接解码到内存,省去截图阶段的 PNG 压缩和临时文件。最终保存和复制仍导出 PNG。后台复用 Slint 界面、控制器和字体注册;耗时的截图/解码在线程中运行,CV 独立后台分析,旧任务的取消标记不会复用于新会话。
设置 BABRY_TRACE_STARTUP=1 后,stderr 会输出 JSON 阶段耗时:
BABRY_TRACE_STARTUP=1 babry --standalone --screen
BABRY_TRACE_STARTUP=1 babry --daemon
# 在另一终端运行 babry 或 babry --screenoutput 为显示器查询完成,capture-ready 为截图管道及解码完成,ui-prepared 为像素上传准备完成,first-render 为 Slint 首次完成场景渲染。最后一项位于显示呈现之前,不等同于合成器显示完成,也不包含后台模式客户端进程启动和 IPC 之前的时间。软件渲染器等不支持渲染通知时会报告埋点不可用。不要把同一台已预热机器的测量视为所有低配设备的冷启动结果。
选区阶段不提前分配编辑画布;首次提交标注后只创建选区大小的画布。绘制预览按标注包围盒生成局部图像,多次输入合并到约 16ms 的刷新节奏;提交和重做增量绘制,撤销在选区内重建。导出复用内存原图或已提交画布,标注字体在首次文字输入时加载,并与 Slint 共用字体字节。
运行可重复的编辑热点基准:
cargo run --release --locked --example editor_bench基准使用 4K 原图、960×540 选区,测量 120 次短自由笔预览和 20 次提交,输出耗时与 CPU 像素缓冲区大小。它不包含完整 UI 帧率、GPU 纹理或整个进程 RSS;大范围笔迹与全屏选区仍需要更多计算和内存。
在提供 layer-shell / viewporter 的 Wayland 会话中,可手动运行 Pin 集成测试:
cargo test --locked --lib pin::tests:: -- --ignored集成测试同时检查缩放复用缓冲区,以及重复指针事件、松手同帧的末次移动、四边四角缩放和边界反向拖动。niri 的隐式抓取坐标与 KWin 的表面局部坐标分别处理,避免表面移动回发事件造成贴图持续漂移;位置和尺寸未变化时不会重复提交。
对已保存的截图运行离线诊断,无需启动 Wayland 截图窗口:
babry --debug-selection screenshot.png /tmp/babry-cv-debug输出目录包含:
candidates.png:所有保留候选及其编号;绿色表示质量评分至少 0.85,橙色表示较弱的候选。candidates.json:对应编号的矩形、检测来源、四侧边界支持度、内部边缘密度、质量评分、排序值和分析耗时。
评分用于启发式排序,不是识别正确率;排序值越小越优先。原图、鼠标位置和期望选区可以一起用于复现误判。
- 编辑器在 niri 下依赖
open-fullscreen窗口规则;未配置时会按普通窗口显示。KDE Plasma 6.8+ 会自动全屏覆盖桌面。 - CV 识别不到明确边界时会回退到全屏,仍可拖动鼠标精确框选。
- 跨显示器拖动 Pin、OCR、贴图持久化和滚动长截图尚未实现。
- Pin 支持
wp_viewporter时,拖动缩放直接由合成器完成;不支持时使用 CPU 重采样回退。
欢迎提交 Issue、改进建议和 Pull Request。特别欢迎:
- 不同 Wayland 合成器上的兼容性反馈;
- 中英文、日韩文字体的渲染样例;
- CV 选区误判截图与可复现图片;
- 新标注工具和更顺手的快捷键设计。
如果 Babry 对你的工作流有帮助,欢迎点一个 ⭐,它会帮助项目被更多 Wayland 用户发现。


