返回目录
开源项目开发者工具类新手

charmbracelet/freeze:为代码与终端输出生成图片

Freeze 是 Charm 团队推出的开源命令行工具,用于把代码文件或终端输出(含 ANSI)渲染成 PNG、SVG、WebP 图片,支持语法高亮、主题、窗口样式、字体、边框、阴影等大量可定制项,并提供交互式 TUI 与 JSON 配置。

0 次阅读2026/09/10 发布
charmbracelet/freeze:为代码与终端输出生成图片 来源图片

社区作者 · zZz

它解决什么问题

项目用途

Freeze 用于为代码和终端输出生成图片,可输出 PNG、SVG 与 WebP 三种格式。它既能给代码文件生成带语法高亮的截图,也能通过 --execute 捕获终端命令的 ANSI 输出。项目内置交互式 TUI,方便直接调参预览。

基本用法

  • 为代码生成图片:freeze artichoke.hs -o artichoke.png
  • 捕获终端输出:使用 --execute 标志,例如 freeze --execute "eza -lah"
  • 交互式定制:freeze --interactive,配置会写入 $XDG_CONFIG/freeze/user.json,可用 freeze --config user 读取。

配图 1 为教程示意图;配图 2 为 Freeze 代码截图演示;配图 3 至配图 12 依次展示阴影、ANSI 输出、交互模式、Haskell 代码块、dracula 主题、8px 圆角、窗口控件、边框、内边距、外边距等不同定制效果。

可定制项与常用标志

来源列出以下标志(可用 freeze --help 查看全部):

  • -b, --background:填充背景色。
  • -c, --config:基础配置文件或模板。
  • -l, --language:指定代码语言。
  • -m, --margin:为窗口添加外边距。
  • -o, --output.svg.png.jpg 的输出位置。
  • -p, --padding:为代码添加内边距。
  • -r, --border.radius:窗口圆角半径。
  • -t, --theme:语法高亮主题。
  • -w, --window:显示窗口控件(macOS 风格)。
  • -H, --height:终端窗口高度。
  • --border.width--border.color:边框宽度与颜色。
  • --shadow.blur--shadow.x--shadow.y:阴影高斯模糊与偏移。
  • --font.family--font.ligatures--font.size--font.file:字体族、连字、字号、嵌入字体文件(SVG 内嵌)。
  • --line-height:相对字号的行高。
  • --show-line-numbers:显示行号。
  • --lines:捕获指定行范围(start,end)。

语言、主题与输出

  • 语言:Freeze 会尽量根据文件名或内容自动识别语言,可用 --language 覆盖,例如 cat artichoke.hs | freeze --language haskell
  • 主题:用 --theme 切换配色,例如 freeze artichoke.hs --theme dracula
  • 输出:默认输出 out.svg,若被管道接收则输出到 stdout;支持 .svg.png.webp,也可一次多格式:freeze main.go --output out.{svg,png,webp}

字体与排版

可指定字体族、字号与行高,默认 JetBrains Mono、14(px)、1.2(em):

代码
freeze artichoke.hs \
  --font.family "SF Mono" \
  --font.size 16 \
  --line-height 1.4

也可用 --font.file 嵌入 TTF、WOFF 或 WOFF2 字体文件,用 --font.ligatures 启用字体连字。

样式示例

  • 行号:freeze artichoke.hs --show-line-numbers,配合 --lines 2,3 只捕获指定行。
  • 圆角:freeze artichoke.hs --border.radius 8
  • 窗口控件:freeze artichoke.hs --window
  • 背景:freeze artichoke.hs --background "#08163f"
  • 高度:freeze artichoke.hs --height 400
  • 边框:freeze artichoke.hs --border.width 1 --border.color "#515151" --border.radius 8
  • 内边距与外边距:可传 1、2 或 4 个值,如 freeze main.go --padding 20(四边)、--padding 20,40(垂直、水平)、--padding 20,60,20,40(上、右、下、左);外边距同理 --margin 20/20,40/20,60,20,40
  • 阴影:freeze artichoke.hs --shadow.blur 20 --shadow.x 0 --shadow.y 10

截图 TUI

可使用 tmux capture-pane 截取 TUI 界面:先把 TUI 运行在 tmux 中并调整到想捕获的状态,然后用 capture-pane 抓取窗格并管道传给 freeze,例如:

代码
hx # in a separate pane
tmux capture-pane -pet 1 | freeze -c full

配置文件

Freeze 支持通过 JSON 文件配置,用 --config / -c 传入;一般情况下所有 --flag 选项与配置文件的键值一一对应。内置若干可直接按名称使用的默认配置:

  • base:简洁的代码截图。
  • full:类似 macOS 的截图。
  • user:使用 ~/.config/freeze/user.json

示例:

代码
freeze -c base main.go
freeze -c full main.go
freeze -c user main.go # alias for ~/.config/freeze/user.json
freeze -c ./custom.json main.go

示例配置内容:

json
{
  "window": false,
  "border": {
    "radius": 0,
    "width": 0,
    "color": "#515151"
  },
  "shadow": false,
  "padding": [20, 40, 20, 20],
  "margin": "0",
  "font": {
    "family": "JetBrains Mono",
    "size": 14
  },
  "line_height": 1.2
}

适用对象

需要在文档、博客、社交媒体、演示幻灯片中展示代码或终端输出效果的开发者、技术写作者与开源维护者;以及需要为 TUI 项目制作截图的命令行工具作者。

贡献与反馈

项目提供 contributing 指南;反馈渠道包括 Twitter、The Fediverse 与 Discord。Freeze 是 Charm 生态的一部分。

— 本文由 AI 根据公开来源辅助整理,命令、版本与许可证请在使用前到原始页面复核。

安装 / 开始使用

  1. 准备环境:Freeze 提供 Linux、macOS、Windows 的二进制文件与各类包管理安装方式,可按所用系统选择一种;若使用 Go 安装,需要本机具备可用的 Go 工具链(来源未注明具体最低 Go 版本,待核验)。
  1. 方式一,macOS 或 Linux 使用 Homebrew:
代码
brew install charmbracelet/tap/freeze
  1. 方式二,Arch Linux:
代码
yay -S freeze
  1. 方式三,Nix:
代码
nix-env -iA nixpkgs.charm-freeze
  1. 方式四,直接下载:来源说明提供 Debian 与 RPM 格式软件包,并提供 Linux、macOS、Windows 的二进制文件。
  1. 方式五,使用 Go 安装:
代码
go install github.com/charmbracelet/freeze@latest
  1. 首次运行验证(把 artichoke.hs 换成你自己的文件):
代码
freeze artichoke.hs -o artichoke.png

默认输出为 out.svg;若被管道接收则输出到 stdout;--output 支持 .svg、.png、.webp,例如 freeze main.go --output out.{svg,png,webp}

  1. 捕获终端输出:使用 --execute 标志,例如 freeze --execute "eza -lah"
  1. 进入交互式定制:
代码
freeze --interactive

配置会写入 $XDG_CONFIG/freeze/user.json,之后可用 freeze --config user 访问该配置。

  1. 使用内置配置模板或自定义配置:
代码
freeze -c base main.go
freeze -c full main.go
freeze -c user main.go
freeze -c ./custom.json main.go
  1. 查看全部选项:freeze --help

常见问题与处理:

  • 语言识别不准:Freeze 会尽量根据文件名或内容自动识别,可用 --language 覆盖,例如 cat artichoke.hs | freeze --language haskell
  • 想截取 TUI:把 TUI 运行在 tmux 中调整到目标状态,再执行 tmux capture-pane -pet 1 | freeze -c full
  • 字体不理想:用 --font.family--font.size--line-height 调整(默认 JetBrains Mono、14px、1.2em),或用 --font.file 嵌入 TTF/WOFF/WOFF2 字体,用 --font.ligatures 开启连字。
  • 只需部分代码:使用 --show-line-numbers 配合 --lines start,end

来源教程配图

教程配图
配图 1 · 教程配图查看原图
Freeze code screenshot
配图 2 · Freeze code screenshot查看原图
output of freeze command, Haskell code block
配图 3 · output of freeze command, Haskell code block查看原图
output of freeze command, ANSI
配图 4 · output of freeze command, ANSI查看原图
freeze interactive mode
配图 5 · freeze interactive mode查看原图
output of freeze command, Haskell code block
配图 6 · output of freeze command, Haskell code block查看原图
output of freeze command, Haskell code block with dracula theme
配图 7 · output of freeze command, Haskell code block with dracula theme查看原图
code screenshot with corner radius of 8px
配图 8 · code screenshot with corner radius of 8px查看原图

适用场景

为博客
文档与 README 生成带语法高亮的代码截图
捕获终端命令的 ANSI 彩色输出并保存为图片
为 TUI 项目制作界面截图(配合 tmux capture-pane)
生成演示幻灯片
社交媒体分享用的代码图片
批量导出 SVG
PNG
WebP 多格式代码资源
通过交互式 TUI 或 JSON 配置统一团队截图样式