Kitty Graphics Protocol
一个完整的 Rust 实现的 Kitty 终端图形协议 库,允许你在支持该协议的终端中显示图像和动画。
功能特性
- ✅ 完整支持所有图形协议命令
- ✅ 支持 RGB、RGBA 和 PNG 图像格式
- ✅ 大图像分块传输
- ✅ 动画支持
- ✅ Unicode 占位符支持
- ✅ 终端窗口大小检测
- ✅ 协议支持检测
- ✅ 零依赖图像显示(PNG 格式)
- ✅ 类型安全的 Builder 模式 API
兼容终端
安装
在 Cargo.toml 中添加依赖:
[]
= "0.1"
快速开始
显示 PNG 图片
use display_png;
// 最简单的方式 - 直接显示 PNG 文件
display_png.unwrap;
显示内存中的 PNG 数据
use display_png_data;
let png_data = read.unwrap;
display_png_data.unwrap;
显示原始 RGB/RGBA 数据
use ImageDisplay;
let display = new;
// 显示 RGB 数据 (每像素 3 字节)
let rgb_data: = vec!;
display.display_rgb.unwrap;
// 显示 RGBA 数据 (每像素 4 字节)
let rgba_data: = vec!;
display.display_rgba.unwrap;
详细用法
1. 高级 ImageDisplay 接口
ImageDisplay 提供了一个高级接口来管理图像显示:
use ImageDisplay;
let display = new
.quiet; // 抑制所有响应消息
// 显示 PNG 文件
display.display_png_file.unwrap;
// 显示 PNG 数据
let png_data = read.unwrap;
display.display_png.unwrap;
// 显示原始像素数据
display.display_rgb.unwrap;
display.display_rgba.unwrap;
// 清除所有可见图像
display.clear_all.unwrap;
2. 图片 ID 管理(传输一次,多次显示)
use ImageDisplay;
let display = new;
let png_data = read.unwrap;
// 传输图片但不显示,分配 ID 为 123
display.transmit_png.unwrap;
// 在不同位置多次显示同一图片
display.place_image.unwrap; // 10 列, 5 行
display.place_image.unwrap; // 20 列, 5 行
// 清除图片
display.clear_all.unwrap;
3. 使用 Command Builder(低级 API)
对于完全控制,使用 Command builder:
use ;
use Write;
// 构建命令
let cmd = builder
.action
.format
.quiet // 抑制响应
.z_index // 设置 z-index
.display_area // 显示区域: 20 列 x 10 行
.build;
// 序列化为转义序列块
let png_data = read.unwrap;
let chunks: = cmd.serialize_chunked.unwrap.collect;
// 输出到终端
let mut stdout = stdout.lock;
for chunk in chunks
stdout.flush.unwrap;
4. 显示原始像素数据
use ;
// RGB 格式 (每像素 3 字节: R, G, B)
let width = 100;
let height = 50;
let rgb_data: =
.map
.collect;
let cmd = builder
.action
.format
.dimensions
.build;
// 输出
let chunks: = cmd.serialize_chunked.unwrap.collect;
for chunk in chunks
5. 删除图像
use ;
// 方式 1: 清除所有图像
clear_all_images.unwrap;
// 方式 2: 使用 Command
let cmd = delete_all;
let seq = cmd.serialize.unwrap;
print!;
// 方式 3: 按 ID 删除
let cmd = delete_by_id;
let seq = cmd.serialize.unwrap;
print!;
// 方式 4: 使用 DeleteTarget
let cmd = builder
.action
.delete_target
.build;
6. 终端信息查询
use ;
// 检查协议支持
match check_protocol_support
// 获取窗口大小
match get_window_size
7. 动画支持
use ;
// 停止动画
let cmd = builder
.action
.animation_control
.image_id
.build;
// 运行动画
let cmd = builder
.action
.animation_control
.image_id
.loop_count // 无限循环
.frame_gap // 帧间隔 100ms
.build;
API 参考
主要类型
| 类型 | 描述 |
|---|---|
ImageDisplay |
高级图像显示接口 |
Command |
图形协议命令 |
CommandBuilder |
命令构建器 |
WindowSize |
终端窗口大小信息 |
快捷函数
| 函数 | 描述 |
|---|---|
display_png(path) |
显示 PNG 文件 |
display_png_data(data) |
显示 PNG 数据 |
clear_all_images() |
清除所有图像 |
check_protocol_support() |
检查协议支持 |
get_window_size() |
获取窗口大小 |
枚举类型
| 枚举 | 描述 |
|---|---|
Action |
命令动作类型 |
ImageFormat |
图像格式 (RGB=24, RGBA=32, PNG=100) |
TransmissionMedium |
传输方式 |
DeleteTarget |
删除目标 |
AnimationControl |
动画控制 |
Compression |
压缩算法 |
CursorPolicy |
光标移动策略 |
示例
项目包含两个示例程序:
基础示例 - 显示图片文件
高级示例 - 程序化生成图像
运行示例
# 克隆仓库
# 运行基础示例
# 运行高级示例
注意事项
- 终端兼容性: 确保在支持 Kitty 图形协议的终端中运行
- 图像格式: 原生支持 PNG 格式;其他格式需转换为 RGB/RGBA 原始数据
- 大图像: 大图像会自动分块传输,无需手动处理
- 图像清理: 程序退出前建议调用
clear_all_images()清理显示的图像
错误处理
use ;
match display_png
性能
- 使用 Base64 编码传输数据
- 支持分块传输大图像(默认 4KB 块)
- 零拷贝设计,最小化内存分配
许可证
MIT License
参考资料
贡献
欢迎提交 Issue 和 Pull Request!