Skip to content
lhs-12Public
forked from kregonia/babry

About

一个在niri上旨在实现区域自动检测的截图工具

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Latest commit

 

History

19 Commits

Folders and files

Repository files navigation

Babry logo

Babry

一款为 Linux Wayland 打造的、懂边界的截图工具。

悬停吸附 · 单击确认 · 拖动精修 · 原位标注 · 一键复制

Build status Apache-2.0 license Built with Rust AUR babry-bin version GitHub stars

快速开始 · 为什么是 Babry · 交互方式 · 开发者


Babry 编辑器与智能选区预览

为什么是 Babry

传统截图工具通常让你在“手动框选”和“调用桌面环境原生选择器”之间二选一。Babry 走第三条路:截取整屏后,用本地 CV 结合边缘、色差和布局分析候选区域,在鼠标悬停时给出选区。

你可以:

  • 悬停就吸附到窗口、面板、卡片或控件;
  • 滚轮换层级,在控件、面板、窗口和全屏之间切换;
  • 单击就确认,不需要反复调整边框;
  • 拖动就精修,任何时候都能切换为像素级手动框选;
  • 在同一个界面完成标注、文字、复制、保存和贴图。

Note

Babry 当前支持 Linux Wayland 下的 niri 和 Hyprland。CV 选区使用 Rust 的 imageproc 内置实现,不依赖 slurp、选区 IPC 或系统 OpenCV 动态库。

预览

智能选区与编辑器

智能选区、遮罩和标注工具栏

悬停目标区域时,Babry 会显示候选框、尺寸和四角控制点;进入编辑后,选区外区域自动变暗,视觉焦点留在需要保存的内容上。

原位文字输入

原位文字输入预览

文字工具参考 PixPin 的输入体验:点击画布后直接输入,文字显示在原位置;字号和颜色在工具栏实时调整,输入效果与最终导出保持一致。

工具栏细节

Babry 工具栏细节

工具栏提供矩形/圆形/方形、画笔、文字、递增数字标注、马赛克/高斯模糊、橡皮擦、荧光笔、撤销/重做、贴图、保存和复制。形状和效果可从右侧箭头打开菜单切换,左侧点阵用于拖动工具栏。

功能一览

能力 体验
CV 智能选区 自适应边缘、颜色边界、背景连通域与长直线分析;质量评分、原图边界精修、滚轮切换层级
全屏截图 grim 获取当前 Wayland 桌面,--screen 直接进入编辑
标注工具 画笔、矩形/圆形/方形、圈号递增数字标注、橡皮擦和半透明荧光笔
隐私处理 局部马赛克与连续轨迹模糊,可调节模糊度
原位文字 直接在画布输入,多行换行;字号、字体和颜色与导出同步
工作流 实时预览、撤销/重做、保存 PNG、复制到剪贴板、Wayland 贴图
轻依赖 Rust + Slint + imageproc;不要求系统 OpenCV、slurp 或 niri 选区命令

快速开始

1. 安装 Babry

Arch Linux 及其衍生发行版用户可以通过 AUR 安装二进制包 babry-bin,无需本地编译 Rust:

yay -S babry-bin
# 或
paru -S babry-bin

如果已配置提供 babry-bin 的二进制软件仓库,也可以使用:

sudo pacman -S babry-bin

pacman 不直接从 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

2. 安装运行依赖

截图需要 grim,复制图片需要 wl-clipboard;可选的 notify-send 用于状态通知。AUR 包已声明 Fontconfig、xkbcommon 和 Wayland 系统库依赖,截图和剪贴板工具请按需安装。

Arch Linux:

yay -S grim wl-clipboard libnotify

3. 开始截图

babry                  # CV 智能区域截图:悬停吸附,单击确认
babry --smart          # 同上,显式使用智能选区
babry --screen         # 截取全屏并直接进入编辑
babry --pin image.png  # 将已有 PNG 作为屏幕贴图
babry --output DP-1 --screen # 指定显示器截图
babry --list-outputs   # 列出 niri/Hyprland 显示器信息
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 资源。内存较少、截图较少时可以使用独立模式。

交互方式

选区阶段

  1. 移动鼠标:从已缓存的候选中选择边界可靠的区域,微小移动保持当前框。
  2. 滚轮向上:扩大到父区域;向下:缩小到鼠标所在的子区域。
  3. 单击:确认当前候选,包括滚轮选择的层级,进入编辑阶段。
  4. 按住拖动:移动超过 3px 后切换为手动框选;松开后确认区域。
  5. 选区边框或角点:在选区阶段也可以直接拖动调整边界,悬停时显示对应缩放光标。
  6. 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 或 Hyprland 的 IPC,读取每个显示器的名称、逻辑位置、逻辑尺寸和缩放比例。

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 的物理尺寸会按缩放比例和旋转转换为逻辑尺寸。默认启动会先通过 IPC 确定焦点显示器,再调用 grim -o NAME 只截取该屏幕;niri 通过 focused-output 查询焦点。无法获取焦点时使用第一个启用的显示器,IPC 查询失败则报告错误。指定不存在的显示器会报错。

当前截图按指定显示器单独捕获,贴图初始尺寸也按目标显示器的逻辑尺寸和缩放计算。跨显示器拖动、把同一张贴图动态迁移到另一块输出,以及不同输出间的实时 layer-shell 重绑定仍在完善中。

niri 配置

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
babry

TrueType Collection(.ttc)可以通过 BABRY_FONT_INDEX 选择字体索引。输入阶段和导出阶段使用同一字体来源,减少“输入时一种字体、保存后另一种字体”的偏差。

技术路线

Wayland 桌面
    │
    ▼
  grim ──► PPM 管道 / 内存原图 ──► imageproc CV 检测器
                              │
                              ▼
                      Slint 选区交互层
                              │
                              ▼
                    Slint 标注编辑器
                      │      │      │
                      ▼      ▼      ▼
                   PNG 保存  剪贴板  layer-shell 贴图

项目结构

src/
├── capture.rs          # grim 截图、通知和剪贴板
├── cli.rs              # 命令解析与帮助文本
├── 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 回归。界面事件测试验证滚轮层级切换、单击确认、手动拖框和局部图像生命周期。

启动性能定位

交互截图使用 grim -t ppm -o NAME - 管道,把无压缩像素直接解码到内存,省去截图阶段的 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 --screen

output 为显示器查询完成,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::viewport_resize_reuses_one_buffer_and_releases_source_pixels -- --ignored

检查 CV 选区

对已保存的截图运行离线诊断,无需启动 Wayland 截图窗口:

babry --debug-selection screenshot.png /tmp/babry-cv-debug

输出目录包含:

  • candidates.png:所有保留候选及其编号;绿色表示质量评分至少 0.85,橙色表示较弱的候选。
  • candidates.json:对应编号的矩形、检测来源、四侧边界支持度、内部边缘密度、质量评分、排序值和分析耗时。

评分用于启发式排序,不是识别正确率;排序值越小越优先。原图、鼠标位置和期望选区可以一起用于复现误判。

当前边界

  • 编辑器在 niri 下依赖 open-fullscreen 窗口规则;未配置时会按普通窗口显示。
  • CV 识别不到明确边界时会回退到全屏,仍可拖动鼠标精确框选。
  • 跨显示器拖动 Pin、OCR、贴图持久化和滚动长截图尚未实现。
  • Pin 支持 wp_viewporter 时,拖动缩放直接由合成器完成;不支持时使用 CPU 重采样回退。

参与贡献

欢迎提交 Issue、改进建议和 Pull Request。特别欢迎:

  • 不同 Wayland 合成器上的兼容性反馈;
  • 中英文、日韩文字体的渲染样例;
  • CV 选区误判截图与可复现图片;
  • 新标注工具和更顺手的快捷键设计。

如果 Babry 对你的工作流有帮助,欢迎点一个 ⭐,它会帮助项目被更多 Wayland 用户发现。

License

Apache License 2.0

About

一个在niri上旨在实现区域自动检测的截图工具

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages