跳到主要内容
ansicode

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 \
hex1b 50 71 ... 1b 5c

说明

Sixel 是 DEC 时代的内联像素图形格式(DEC VT240/VT340),近年被现代终端复活。帧以设备控制字符串引导符 \x1bP(DCS)开头,可选参数段后接末字节 q 选择 Sixel 模式,再是 ?..~ 的可打印字节载荷 —— 每个字节编码一个 6 像素高的竖向切片(故名 sixel)。帧以字符串终止符结尾 —— 标准形式 \x1b\\(ST),也广泛接受 \x07(BEL)。libsixelchafaviutimgranger 风格的图像预览、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)

示例

bash
# A 12x6 magenta block via the Sixel raw payload\nprintf '\033Pq#0;2;100;0;100#0~~\033\\'
python
import sys; sys.stdout.write('\x1bPq#0;2;100;0;100#0~~\x1b\\')
go
fmt.Print("\x1bPq#0;2;100;0;100#0~~\x1b\\")
javascript
process.stdout.write('\x1bPq#0;2;100;0;100#0~~\x1b\\')
c
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
不支持

相关序列

在家族食谱中

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