DCS Sixel — 内联栅格图像(ESC P q … ESC \)
通过 Sixel 设备控制载荷在终端流中嵌入像素图像。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1bPq <sixel data> \x1b\\\\033[
\033Pq … \033\\\\e[
\eP q … \e\\ESC [
ESC P q DATA ESC \hex
1b 50 71 ... 1b 5c说明
Sixel 是 DEC 时代的内联像素图形格式(DEC VT240/VT340),近年被现代终端复活。帧以设备控制字符串引导符 \x1bP(DCS)开头,可选参数段后接末字节 q 选择 Sixel 模式,再是 ?..~ 的可打印字节载荷 —— 每个字节编码一个 6 像素高的竖向切片(故名 sixel)。帧以字符串终止符结尾 —— 标准形式 \x1b\\(ST),也广泛接受 \x07(BEL)。libsixel、chafa、viu、timg、ranger 风格的图像预览、kitten icat --transfer-mode=stream(Kitty 原生协议的 Sixel 回退)以及 mpv --vo=sixel 都使用此序列。终端支持差别明显:xterm 需 +sb 编译并以 -ti vt340 启动;mintty、foot、wezterm、iTerm2、Windows Terminal Canary、ghostty 默认可用;kitty、alacritty、macOS Terminal 不支持(Kitty 有自家更优协议)。
规范出处: DEC VT340 Programmer Reference / xterm-ctlseqs (DCS Ps; Ps; Ps q)
示例
# A 12x6 magenta block via the Sixel raw payload\nprintf '\033Pq#0;2;100;0;100#0~~\033\\'import sys; sys.stdout.write('\x1bPq#0;2;100;0;100#0~~\x1b\\')fmt.Print("\x1bPq#0;2;100;0;100#0~~\x1b\\")process.stdout.write('\x1bPq#0;2;100;0;100#0~~\x1b\\')printf("\x1bPq#0;2;100;0;100#0~~\x1b\\");在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- libsixel + `img2sixel` CLIlibsixel 是参考编码器 —— `img2sixel input.png | cat` 产生 `\x1bPq…\x1b\\` DCS 流,任何支持 sixel 的终端(xterm `+T --tn xterm-direct`、mlterm、foot、关闭 kitty-graphics 的 WezTerm)都能内联渲染。libsixel 通过动态链接为多数其他工具的 sixel 输出提供后端
- gnuplot `set terminal sixel`gnuplot 5.4+ 支持 `set terminal sixel size 800,600` 在终端内联渲染图表 —— 在长跑的拟合过程中想瞥一眼生成的图,又不想开 X11 窗口或保存 PNG 时尤为有用
- ranger / mc image previewranger(配合 `img2sixel` 预览脚本)与 Midnight Commander 在支持 sixel 的终端右侧窗格内联渲染图像文件预览。可移植性优于 kitty-graphics —— sixel 在 xterm / mlterm / foot / WezTerm / Windows Terminal ≥ 1.22 / Black Box 上运行,比 kitty-graphics 的 kitty / WezTerm / Ghostty 三家更广
- matplotlib `mpl_sixel` backendPython:`import matplotlib; matplotlib.use('module://mpl_sixel'); plt.plot([1,2,3]); plt.show()` 把图表作为 sixel 直接在无 Jupyter 的终端中渲染 —— 在 HPC 场景下 Jupyter 不可用、但仍在 shell 中做交互式数值工作时流行
- Black Box / Windows Terminal sixel previewBlack Box(基于 VTE 0.73+ 的 GNOME 终端模拟器)与 Windows Terminal 1.22+ 增加了原生 sixel 渲染 —— `cat photo.six` 内联显示。两者在 CI 中都附带 sixel 感知的测试图样以捕获回归;集成商把它们作为现代参考渲染器对标
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 一段 DCS Sixel 序列里终端能渲染的最大图像尺寸是多少?
- 规范未指定上限 —— Sixel 在单个 DCS 包络(
\x1bPq … \x1b\\)内逐像素行组流式传输,上限取决于终端的像素缓冲分配。实务边界:xterm 用decGraphicsMaxSize(默认 1000×1000),超出静默截断;mlterm / WezTerm / Konsole / foot 接受多兆像素图像,只受内存约束;Windows Terminal 1.22 起加入 Sixel,软上限约 10 MP。真正的瓶颈是性能而非规范 —— 4K 全屏图约 2 MB base-6 编码载荷,终端串行解码并阻塞输入循环。 - 为什么 tmux 内 Sixel 图像渲染成乱码,即使外层终端支持?
- tmux 历史上剥离 DCS 载荷 —— Sixel 以
\x1bP…\x1b\\到达,tmux 解析器吃掉首尾,留下 base-6 主体作字面字符显示。两种修法:(1)set -g allow-passthrough on,并把每段 Sixel 包进\x1bPtmux;<escaped>\x1b\\(tmux;透传包络,内层\x1b双写成\x1b\x1b);(2) 从 tmux 3.4 起原生 Sixel 支持,可经set -g sixel on启用 —— 无需透传包络。3.4+ 用方案 2;老版本只能用方案 1。
终端支持
- xterm
- 部分
- Linux console (fbcon)
- 不支持
- macOS Terminal.app
- 不支持
- iTerm2
- 支持
- Windows Terminal
- 部分
- cmd.exe / ConPTY
- 不支持
- kitty
- 不支持
- alacritty
- 不支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 部分
- Konsole
- 支持
- tmux
- 部分
- GNU screen
- 不支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 部分 | 不支持 | 不支持 | 支持 | 部分 | 不支持 | 不支持 | 不支持 | 支持 | 支持 | 部分 | 支持 | 部分 | 不支持 |