跳到主要内容
ansicode

Kitty 图形协议 —— 内联像素图像(ESC _ G … ESC \)

Sixel 的现代替代:通过 Kitty APC 帧把 PNG / RGBA 字节流式发送给终端,配合合理的分块与放置协议。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b_Ga=T,f=100,m=1;BASE64_CHUNK\x1b\\
\\033[\033_Ga=...;PAYLOAD\033\\
\\e[\e_G a=...;PAYLOAD \e\\
ESC [ESC _ G key=value,... ; BASE64 ESC \
hex1b 5f 47 ... 1b 5c

说明

Kitty 图形协议 —— kitty.sh 设计的 Sixel/iTerm-img 现代替代 —— 使用 APC(Application Program Command)帧:引导符 \x1b_(ESC _),字面 G 标识图形命令,逗号分隔的 key=value 控制头(a=T 传输并显示、f=100 PNG、f=24 RGB、f=32 RGBA、s v 像素宽高、m=1 还有后续分块/m=0 最后一块、i=ID 图像 ID 便于重新放置),;,然后每块最多 4096 字节的 base64 载荷,以 ST(\x1b\\)结尾。kitty + ghostty + wezterm 原生支持;konsole 部分支持。iTerm2 自家 \x1b]1337;File=... 协议是另一选项;两者正逐步向 Kitty 的设计靠拢。Sixel(DCS Pq)是两者均不支持时的传统回退。

规范出处: Kitty Graphics Protocol (sw.kovidgoyal.net/kitty/graphics-protocol/)

示例

bash
# Display a PNG file inline (one-shot, no chunking):\nb64=$(base64 -w0 cat.png)\nprintf '\033_Ga=T,f=100;%s\033\\' "$b64"
python
import base64, sys\npng = open('cat.png','rb').read()\nsys.stdout.write('\x1b_Ga=T,f=100;' + base64.b64encode(png).decode() + '\x1b\\')
go
data, _ := os.ReadFile("cat.png")\nfmt.Printf("\x1b_Ga=T,f=100;%s\x1b\\\\", base64.StdEncoding.EncodeToString(data))
javascript
import fs from 'node:fs';\nconst b64 = fs.readFileSync('cat.png').toString('base64');\nprocess.stdout.write('\x1b_Ga=T,f=100;' + b64 + '\x1b\\')
c
/* read PNG into buf, base64-encode, then: */\nprintf("\x1b_Ga=T,f=100;%s\x1b\\\\", b64);

在哪里用到

实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。

  • kitty `icat` (kitten icat)随 kitty 发行版提供为 `kitten icat <file>` —— 催生 kitty-graphics 协议需求的标志命令。读取 PNG / JPEG / GIF / WebP,发出分块 `\x1bGa=T,f=100…\x1b\\` DCS 流,在终端当前光标位置内联渲染
  • mpv terminal output (`--vo=kitty`)mpv 0.37+ 自带 `kitty` 视频输出驱动 —— `mpv --vo=kitty video.mp4` 把视频作为一系列 kitty-graphics 帧在终端播放。帧率受终端 blit 速度限制(kitty / WezTerm / Ghostty 上约 15-30 fps);用于无头预览和 SSH 上的播放
  • fastfetch / neofetch image rendering积极维护的 fastfetch(及其前身 neofetch)在 `--kitty` 或自动检测到 kitty / WezTerm / Ghostty 时,用 kitty-graphics 渲染系统徽标块 —— 取代早期的 Unicode 块回退,在支持的终端上获得明显更高保真的渲染效果
  • presenterm terminal slide deckspresenterm 用 kitty-graphics 在终端幻灯片中内联渲染 markdown 图片引用 —— 翻页时发 `a=d`(全部删除)帧清理残留,避免相邻幻灯片图像重叠
  • yazi file manager preview paneyazi(Rust TUI 文件管理器)检测 kitty / WezTerm / Ghostty 等支持 kitty-graphics 的终端,在右侧窗格通过 kitty-graphics 渲染图像预览 —— 启动时根据 terminfo 能力探测回退到 sixel 或 Unicode 块

常见问题

针对这条序列,开发者真正会去搜索的问题的简短回答。

Kitty graphics 与 Sixel 有何不同 —— 怎么选?
三大差异:(1) 编码 —— kitty 用 base64 包装原始 RGBA / PNG 字节,置于类 DCS 的 APC 包络(\x1b_G … \x1b\\);Sixel 用 base-6 打包位图编码,对低色数图更小、对照片膨胀更严重;(2) 分块传输 —— kitty 用 m=1 续传标记把大图拆进多个 APC 包;Sixel 整图单包络发出,于是 kitty 能干净处理 50 MB 照片,Sixel 则把输入循环噎住;(3) 持久化与定位 —— kitty 按 id 引用已上传图像,可在 z 序 / 鼠标格坐标定位;Sixel 只在当前光标处一次性绘出。要尺寸与交互选 kitty;要可移植性选 Sixel(xterm、foot、mlterm 开箱即用;kitty graphics 需要 kitty / Ghostty / WezTerm)。
发图像前如何检测终端是否支持 kitty graphics?
用 kitty graphics 协议发一张 1×1 透明 PNG,置 q=1(仅查询,不显示),并附唯一 id(i=<rand>):\x1b_Gi=42,q=1,f=100;<base64-1px-png>\x1b\\。支持的终端在约 100 ms 内回 \x1b_Gi=42;OK\x1b\\;不支持的终端沉默(请设 200 ms 读超时)。id 用于避免应答与无关图形回复抢答。也可用 XTVERSION \x1b[>q 拿终端名 + 版本,按白名单(kitty、Ghostty、WezTerm、konsole 24.04+)放行。

终端支持

xterm
不支持
Linux console (fbcon)
不支持
macOS Terminal.app
不支持
iTerm2
部分
Windows Terminal
不支持
cmd.exe / ConPTY
不支持
kitty
支持
alacritty
不支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
不支持
Konsole
部分
tmux
不支持
GNU screen
不支持

相关序列

在家族食谱中

DCS 食谱 · 2. 流内画图 —— Sixel 与 Kitty 图形