Skip to content

oliveagle/lsix_rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lsix-rs - lsix 的 Rust 实现

这是一个用 Rust 重写的高性能版本 lsix,用于在支持 SIXEL 的终端中显示图像缩略图。

特性

  • 🚀 并发处理:使用 Rayon 实现图像的并发加载和验证,显著提升处理速度
  • 🔍 终端自动检测:自动检测终端的 SIXEL 支持、颜色数、几何尺寸和配色方案
  • 🎨 智能配色:自动使用终端的背景色和前景色来生成缩略图
  • 📁 灵活的输入:支持指定文件路径或自动查找当前目录的图像文件
  • 🔄 目录递归:自动递归处理指定的目录
  • 🏷️ 智能标签:支持 AI 标签和文件名标签,以及高级标签查询(AND/OR/NOT)

系统要求

  • Rust 1.70+ (用于编译)
  • ImageMagick 7.x(必须支持 magick 命令)
  • 支持 SIXEL 的终端,例如:
    • xterm -ti vt340
    • mlterm
    • wezterm
    • foot(部分支持)

安装

从源码编译

# 克隆仓库
git clone <repository-url>
cd lsix_rs

# 编译发布版本
cargo build --release

# 安装到系统路径
sudo cp target/release/lsix /usr/local/bin/

使用方法

基本用法

# 显示当前目录的所有图像
lsix

# 显示指定的图像文件
lsix photo1.jpg photo2.png

# 递归显示目录中的图像
lsix /path/to/images/

# 混合使用文件和目录
lsix photo.jpg /path/to/images/

# 列出所有标签及其统计
lsix --list-tags

标签查询

支持三种标签过滤模式:

# OR 逻辑 - 匹配任意标签(默认)
lsix --tag beach --tag sunset
lsix --tag "beach,sunset"  # 逗号分隔

# AND 逻辑 - 必须包含所有标签
lsix --tag-and beach --tag-and sunset
lsix --tag-and "beach,sunset"

# NOT 逻辑 - 排除标签
lsix --tag beach --tag-not blurry

# 组合查询
lsix --tag beach --tag-and sunset --tag-not blurry

命令行选项

lsix [OPTIONS] [FILES...]
  • FILES: 图像文件或目录的路径。如果未指定,则在当前目录查找图像文件。

支持的图像格式

lsix-rs 支持所有 ImageMagick 支持的格式,包括但不限于:

  • JPEG (jpg, jpeg)
  • PNG (png)
  • GIF (gif)
  • WebP (webp)
  • TIFF (tiff, tif)
  • BMP (bmp)
  • SVG (svg)
  • EPS (eps)
  • 以及更多...

性能优化

与原始的 bash 脚本版本相比,Rust 版本具有以下优势:

  1. 极快的启动速度 - 智能终端检测,启动时间从 3-5 秒降至 < 0.1 秒(20-50 倍提升
  2. 并发图像处理 - 使用 Rayon 实现多核并行,处理速度提升 3-5 倍
  3. 更低的内存占用 - 高效的内存管理,内存使用减少 40%
  4. 零成本抽象 - Rust 的零成本抽象提供了高效的内存使用
  5. 更好的错误处理 - 使用 anyhow 提供详细的错误信息
  6. 类型安全 - 编译时类型检查减少运行时错误

详见 PERFORMANCE.md 获取详细的性能分析和优化说明。

工作原理

  1. 终端检测:通过 ANSI 转义序列查询终端的能力
  2. 文件收集:收集所有图像文件路径
  3. 并发验证:并发地验证图像文件并准备元数据
  4. 分批处理:将图像分成批次(行),每批包含多个缩略图
  5. 生成缩略图:使用 ImageMagick 的 montage 工具生成蒙太奇
  6. SIXEL 编码:将结果编码为 SIXEL 格式并输出到终端

与原版的差异

改进

  • ✅ 并发图像处理,显著提升速度
  • ✅ 更好的错误处理和恢复
  • ✅ 类型安全的实现
  • ✅ 更容易维护和扩展

限制

  • ⚠️ 需要 ImageMagick 7.x(原版也支持 ImageMagick 6)
  • ⚠️ 某些高级选项(如自定义字体)需要通过代码配置

环境变量

  • LSIX_FORCE_SIXEL_SUPPORT: 设置此变量可跳过 SIXEL 检测(用于测试)

性能对比

快速启动(最重要的优化)

# Bash 版本启动时间
time lsix *.jpg
# real: 3-5 秒(大部分时间在终端查询)

# Rust 版本启动时间
time ./target/release/lsix *.jpg
# real: < 0.1 秒(使用智能检测 + 默认值)

# 性能提升: 20-50 倍!

并发图像处理

处理 100 张图像的时间对比:

  • Bash 版本: ~13 秒(顺序处理)
  • Rust 版本: ~3 秒(4核并发)
  • 性能提升: 4.3 倍

配置和优化

环境变量

# 如果您的终端支持 SIXEL 但检测失败
export LSIX_FORCE_SIXEL_SUPPORT=1

# 或添加到 ~/.bashrc
echo 'export LSIX_FORCE_SIXEL_SUPPORT=1' >> ~/.bashrc

自定义默认值

编辑 src/terminal.rs 来修改默认配置:

// 默认终端宽度(像素)
Ok(1024)  // 改为您的终端宽度

// 默认颜色数
Ok(256)   // 16, 256, 或动态颜色

故障排除

终端不支持 SIXEL

如果看到错误 "Your terminal does not report having sixel graphics support",请:

  1. 确认您的终端支持 SIXEL
  2. 对于 xterm,使用 xterm -ti vt340 启动
  3. 或者在您的 .Xresources 中设置:
    xterm*decTerminalID: vt340
    

ImageMagick 未安装

确保已安装 ImageMagick:

# Ubuntu/Debian
sudo apt install imagemagick

# macOS
brew install imagemagick

# Fedora
sudo dnf install imagemagick

许可证

本项目遵循与原版 lsix 相同的双许可协议:

  • GNU GPL v3 或更高版本
  • 或者 xterm 使用的任何许可证

致谢

  • 原始的 lsix 由 hackerb9 开发
  • 本项目使用 Rust 生态系统中的优秀库:
    • rayon - 数据并行性
    • clap - 命令行参数解析
    • anyhow - 错误处理
    • regex - 正则表达式
    • glob - 文件模式匹配

贡献

欢迎提交 issue 和 pull request!

About

lsix in rust

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors