只需一个console.log:用img-ascii-term在终端显示ASCII字符画
2026/9/24 18:41:44 网站建设 项目流程

把图片变成 ASCII 字符画,这件事其实我一直觉得挺"反直觉"的——正经人谁会在终端里看图?可偏偏在我动手做这个小工具的时候,才意识到这个需求真实存在,而且比你想象的更日常。前几天我要在一台没有任何图形界面的服务器上确认一张图片素材是否完整,手头没有feh,没有img2txt,连python都懒得装,最后是靠着 Node.js 环境里一段十几行的脚本,用img-ascii-term把图直接打在终端里,几秒就确认了内容。那一刻我真觉得,"只需一个 console.log 就能在终端展示图片"这件事,对于一个天天泡在命令行里的开发者来说,不是玩具,是实实在在的生产力。

img-ascii-term是一个 Node.js 库,核心干的事情只有一件:把图片转换成彩色或者黑白的 ASCII 字符画,然后输出成一段字符串,你直接console.log就能在终端里看到结果。它解决的痛点是——在没有图形界面、不方便打开图片、或者想让 CLI 工具在输出信息时带上一张"图"的场景下,如何用最轻量的方式展示图像信息。这篇文章我会从它的原理拆起,再带上完整的调用示例、参数调优思路、以及我在 Windows 和 Linux 两种环境里踩过的坑,希望能帮你少走弯路。

1. 为什么有"终端读图"这个需求?——从日志可视化到纯文本预览

1.1 场景:服务器上没有图形界面

很多基础不深的开发者可能还没遇到过这种局面,但干过运维、或者常年跟远程服务器打交道的人一定懂:服务器上是不配桌面的。

我经常要在生产环境的服务器上排查问题,比如:上传目录里的图片到底存没存对?CDN 回源的文件是不是跟预期一致?对象存储同步过来的文件是不是损坏的?这些场景下,我只有 SSH 终端,没有"打开图片查看"这种操作。

以前的做法无非几种:把图片scp到本地再看,太麻烦;用file命令看文件头,只能判断格式;用xxd看十六进制,能看出个寂寞。有了img-ascii-term之后,直接一脚本拉过来,console.log一下,图片的大致构图、颜色分布、人物轮廓,一目了然。虽然不可能像 GUI 那样看细节,但"快速确认图片大致内容"这个诉求,它完成得非常好。

1.2 场景:CLI 工具的自我展示

第二个需求来自 CLI 工具的开发者。现在很多命令行工具都有"启动横幅"(Banner),比如clear一下然后打一个大大的 ASCII Art Logo,这是很多 CLI 项目的传统艺能。

但如果你的工具要展示的不是文字 Logo,而是图片呢?比如你做一个图片处理工具,在终端里启动时想把示例图、或者用户指定的图片先预览一下;再比如你写一个爬虫工具,抓到一个网页后想把页面里的缩略图在终端里打出来;甚至只是一个开发者的个人网站,想在自己写的终端小工具里放一张自己的头像——这些都是实打实的场景。

img-ascii-term让这个过程变成了异步一行代码的事,不依赖任何系统级库,纯 Node.js 生态,装进项目就能用。这也是它最打动我的点:你不需要引入一个重量级的图像处理框架,只为在终端里显示一张图。

1.3 "只需一个 console.log"意味着什么?——库帮你搞定了整个图像管线

标题里最扎眼的词,其实是"只需一个 console.log"。这句话的潜台词是:从图片文件到终端展示之间那一整套繁琐的工序,这个库已经全部替你封装好了。

如果你自己手动实现,这个过程大致是这样的:

  1. 读取图片文件,解析二进制格式(PNG、JPG、GIF 各有不同的容器格式)。
  2. 解码像素数据,得到一个二维的 RGB 颜色矩阵。
  3. 对像素矩阵进行缩放,匹配终端输出需要的宽高比。
  4. 对每个采样块计算灰度值。
  5. 将灰度值映射到字符表(比如"@%#*+=-:. ")中的某个字符。
  6. 如果要彩色输出,还得给每个字符拼接上 ANSI 颜色转义序列。
  7. 最后把所有字符按行拼成字符串。

每一步都有不少细节,尤其是图片解码这一步,没有现成库帮忙的话工作量巨大。所以img-ascii-term的"一键"不是玄学,它是在底层替你完成了这套完整流水线,而你暴露的入口只有一个函数调用。理解了这层,你就明白它为什么这么好用了——那些复杂的东西都被关在黑盒里了。

2. 核心原理拆解:像素、灰度、字符与 ANSI 转义

2.1 从图像矩阵到字符序列的两次映射

字符画的核心逻辑,本质上是一套"降维映射"。

图片在计算机里的本质是一个二维数组:数组的每一个元素是一个像素点,每个像素点有 RGB 三通道的值。比如一张 800x600 的图片,就是 800 列、600 行的像素矩阵。

但引终端是纯文本世界,它不认识像素。它只认字符。所以我们必须做一次转换:把一块区域的像素,映射成"一个字符"。这个操作叫像素块采样(Block Sampling)。

举个例子:如果要把一张 800x600 的图以 80 列宽度输出,那么每个字符对应的原始区域大概是 10x12 像素(具体高度还要看宽高比调整)。系统取出这块区域的若干个像素,计算它们的平均明度,然后选一个字符代表它们。

这里就有第一个关键选择:字符的选择。不同的字符在视觉上给人的"明暗感"不一样,因为字符的笔画覆盖率不同。比如@#笔画多,看起来就"重";.和空格笔画少,看起来就"轻"。把一串从重到轻的字符排成一个序列,就构成了字符密度表。这是整个 ASCII 字符画技术的理论基础。

2.2 字符密度映射表

常见的字符密度映射表长这样:

"$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\"^`'. "

$(笔画最密,视觉最重)到空格(视觉最轻),基本覆盖了从纯黑到纯白的亮度区间。

img-ascii-term内部实现时用的字符集其实要精简一些,比较常见的是:

" `.-':_,^=;><+!rc*/z?sLTv)J7(|Fi{C}fI31tlu[neoZ5Yxjya]2ESwqkP6h9d4VOGbUAKXHm8RD#$Bg0MNWQ%&@"

或者更简化的版本:

"@%#*+=-:. "

你不需要背表,只需要理解:亮度高的区域映射到笔画稀疏的字符(比如.),亮度低、阴影重的区域映射到笔画密集的字符(比如@)。如果开了反色(reverse: true),映射关系反过来,适合在深色终端里模拟"白底黑字"的效果。

2.3 彩色输出靠的是 ANSI 24 位真彩色

黑白字符画只反映亮度信息,但彩色字符画就多了一个维度:颜色空间。

终端彩色输出的标准做法是用 ANSI 转义序列。其中 24 位真彩色(True Color)的格式是:

\x1b[38;2;R;G;Bm // 设置前景色(字符颜色) \x1b[48;2;R;G;Bm // 设置背景色(底色)

\x1b是 ESCASCII 码,38;2表示使用真彩色前景色,R;G;B直接填 RGB 三个通道的十进制值,取值范围 0~255。在字符画输出结束后,再发一个\x1b[0m重置所有样式,避免颜色串到后面的终端内容上。

img-ascii-term在彩色模式下的思路是:每个字符本身的像素块采样出平均 RGB 值,然后将这个 RGB 值直接写进\x1b[38;2;R;G;Bm,前景色就变成了那个颜色;字符本身的亮度映射决定用哪个字符。这样的话,即使你远看是一副颜色分明的"图",近看又能看出字符纹理,观感相当特别。

这就是标题里说的"特殊字符"的另一个含义——那些不可见的转义字符,才是彩色输出的真正功臣。

2.4 纵横比补偿

这是所有字符画工具绕不过去的一个细节:终端字符不是正方形的。

一个终端里的字符占据的格子通常是"高 > 宽"的矩形,具体比例因字体而异,但大致是 1.8:1 ~ 2.2:1 之间。如果你直接把图片的像素逐点映射成字符,生成出来的图会被纵向拉长,脸变驴脸。

所以工具在做宽度映射时,会默认把"高度方向的采样步长"按比例放大。举例来说:原图是 400x400 的正方形,你期望输出 80 个字符宽,那么按像素等比缩放高度应该是 80,但实际上应该输出大约80 * 400 / 400 / 2 = 40行字符,效果才接近原图比例。

img-ascii-term内部会处理这层换算,但你可以通过divideXdivideY参数手动干预。如果你发现输出的图明显"变胖"了,降低divideY或提高divideX就能把图"压扁"回来。

3. 快速上手:安装、环境检查与第一条 console.log

3.1 环境准备

先确认环境,这是最容易卡住第一步的地方。

  • Node.js 版本:建议 14.0 及以上。我用的是 Node 16/18 环境,都能正常工作。你要是还在用 Node 10,建议先升级,因为库依赖的某些 ES2015+ 特性在老版本上会报错。
  • npm 或 yarn:任意一个包管理器都行。
  • 终端要求:这个很关键。彩色模式依赖终端对 ANSI 转义序列的支持。

现代终端基本都支持,包括 Windows Terminal、VS Code 集成终端、macOS 的 Terminal.app、iTerm2、Linux 的 GNOME Terminal 和 Konsole。但老旧的 Windows 传统控制台(conhost.exe 未启用 VT 处理时)可能会出问题,这部分我在后面踩坑章节会细讲。

安装过程没啥玄学:

npm install img-ascii-term

装完之后建议顺手验证一下是不是真的能用。

3.2 最小可运行示例

安装完成后,先找一张图片。假设你的项目目录下有一张demo.png,那么最简单的用法是这样:

const { imgToAscii } = require("img-ascii-term"); imgToAscii({ imgSrc: "./demo.png", color: true }).then(console.log);

就是这么粗暴。运行node index.js,你的终端里就会出现这张图的彩色字符画。

这段代码做了什么?imgToAscii是个返回 Promise 的异步函数,它接收一个配置对象,解码这张图,完成采样、映射、拼接,最后返回一个字符串。所以.then(console.log)就是最简单的"拿到结果就打印"。

如果你想用回调风格,库里也支持:

const { imgToAscii } = require("img-ascii-term"); imgToAscii({ imgSrc: "./demo.png", color: false }, (err, str) => { if (err) { console.error("转换失败:", err); return; } console.log(str); });

不过我建议统一用 Promise 风格,配合async/await写起来更顺手:

const { imgToAscii } = require("img-ascii-term"); (async () => { try { const asciiArt = await imgToAscii({ imgSrc: "./demo.png", color: true }); console.log(asciiArt); } catch (err) { console.error(err); } })();

3.3 彩色模式与黑白模式的最简体验

上面示例里color: true走的是彩色模式,color: false则是黑白模式。你应该会好奇这两个模式下输出有啥差异。

黑白模式输出的是纯文本字符序列,没有颜色转义码,直接把返回值console.log出来,就是一个纯粹的、由字符组成的图案。这种模式的好处是通用性极强——你甚至可以把这段字符串粘贴到任何文本文件、聊天窗口、代码注释里,都不会丢格式。

彩色模式的返回值则是一串包含大量 ANSI 转义码的混合字符串。它在支持的终端里显示为彩色画面,但如果你把它复制到不支持 ANSI 的旧终端、或者粘贴到富文本编辑器里,就会看到一大坨[38;2;xxx;xxx;xxxm这种乱码,这是正常的,不是 bug。

所以我的建议是:日常终端展示用彩色,体验更直观;做日志、存文件、跨平台分享的场景,用黑白更稳妥。

4. 参数详解:配色、尺寸、采样、反转这些选项到底怎么调

4.1 参数总览表格

img-ascii-term的配置项不算多,但每个都对输出效果有直接且明显的影响。我整理了一份参数速查表:

参数默认值作用我的建议
imgSrc无(必填)图片路径,支持本地路径和远程 URL本地路径可用path.resolve转绝对路径
colorfalse是否启用彩色输出(ANSI 真彩色)终端支持就开true
isShowBgColorfalse是否显示背景色块想让画面"像素感"更强可以开
reversefalse是否反色(黑白模式反转字符映射)深色终端默认不开,浅色终端开了更清晰
divideX1X 方向采样步长(像素跳跃间隔)值越大,宽度方向细节越少
divideY1Y 方向采样步长值越大,高度方向细节越少
width80输出字符画的目标宽度建议 60~120,太宽会换行
fontRatio2终端字体的高宽比补偿系数保持默认,变形再调

4.2 宽度与采样参数:怎么控制输出大小

width是最好理解的——输出多少个字符宽度。但你得考虑终端实际宽度。一般来说终端一行能显示 80~200 个字符,我实测下来 100 左右是舒适区,既能看清细节,又不会让画面超出屏幕导致换行打断图案。

如果设置太宽(比如 200+),字符画很可能被终端折行,整体观感直接崩掉。所以如果你不确定目标终端宽度,保守一点用 80 是安全的。

divideXdivideY这两个参数是压缩输出的关键。它们是"每隔多少个像素采样一次"的意思。

举例说明:

  • divideX: 1, divideY: 1:图片的每 1 个像素可能对应 1 个字符(再考虑宽高比),细节最丰富,输出最大,性能最差。
  • divideX: 2, divideY: 2:每 2x2 的像素块合并成一个字符,输出尺寸减半。
  • divideX: 4, divideY: 4:更粗糙,但极快。

实际使用时,转换一张 4000x3000 的高清大图,如果divideX: 1就会生成一张巨大无比的字符画,终端根本装不下,而且计算耗时明显。配合width做限制会更合理:多数情况建议通过width约束输出边界,而divideX/divideY用来做精细调节。

我常用的调参思路是:先固定width: 100,把divideX: 1divideY: 1跑一遍看效果,如果太大或太毛糙,逐步增大divideXdivideY,直到画面细节和尺寸达到平衡。

4.3 彩色模式、背景色与反色的选择思路

这三个参数的影响是叠加关系,我分别说下实践结论。

彩色模式(color: true:最有视觉冲击力的选择,但它有一个副作用——如果原图颜色比较暗,明明画面里有个红色元素,但因为亮度低映射到了@%这种重字符上,你依然能看出红色调的色块。这是优点。但如果原图整体很暗,所有字符都映射到高密度字符上,颜色区域就混成一团,看不太清轮廓。这时配合reverse: true会有奇效——暗部映射到轻字符,反而凸显出颜色形状。

背景色(isShowBgColor:这个参数建议仅在特定场景开启。开启后,每个字符的背景色被设置为采样块的颜色,配合字符前景色,画面会呈现非常强的"像素感",像点阵图。但代价是终端兼容性下降,而且在行间距较大的终端里会出现横纹——背景色块之间有细小的空隙,看着像一道一道的横线笔芯。不推荐追求清晰度的场景开启。

反色(reverse:黑白模式下的核心调参项。默认映射是"亮部用空格/点、暗部用 @/#",在深色终端下显示正常。但如果你把终端背景改成白色(很多人喜欢白底 + 黑字的阅读体验),默认映射会让白色的区域"消失"在白底里,暗部也只是黑字,很难看清。reverse: true可以把映射反过来,白底黑字场景反而出奇地清晰。具体效果取决于你的终端主题,建议两种都试一眼,再决定用哪个。

4.4 用 initOptions 做全局配置

img-ascii-term还暴露了一个initOptions方法,用来设置全局默认选项。这在你多次调用imgToAscii转换多张图片时特别有用:

const { initOptions, imgToAscii } = require("img-ascii-term"); initOptions({ isShowBgColor: false, divideX: 2, divideY: 2, reverse: false, width: 100, color: true }); const art1 = await imgToAscii({ imgSrc: "./a.png" }); const art2 = await imgToAscii({ imgSrc: "./b.png" });

这样就不用每次调用时重复传一样的参数了。注意initOptions设的是"默认值"级别,后续单次调用的显式传参会覆盖它。

5. 实测效果:同一张图在彩色、黑白、不同宽度下的表现

5.1 测试环境

作为参考,我实际的测试环境是:

  • Ubuntu 22.04 LTS,终端为 GNOME Terminal 3.44
  • 另一台机器为 Windows 11 专业版,测试终端为 Windows Terminal
  • Node.js 版本 18.12.1
  • 测试图片:一张 640x427 的普通风景照

5.2 三组测试对比

第一组:黑白模式,默认宽度 80,divideX=1

那是我第一次跑这个库,输出速度很快,几乎秒出。图片远看轮廓清楚,近看能认出这是地标建筑,但由于没有颜色,很多信息(比如天空、草地、建筑表面材质)只能靠明暗层次区分。整体观感像老式报纸上的照片。这组测试最直观的结论是:黑白模式适合"确认构图",不适合"辨认颜色"。

第二组:彩色模式,color=true,其余不变

切换成彩色模式后,观感直接上升一个台阶。因为保留了 RGB 信息,天空明显是蓝色调,草地是绿色调,建筑墙面偏暖色。字符密度负责勾勒轮廓和明暗,前景色负责填充色调,二者叠加后视觉信息量大增。唯一要注意的是:如果你之前已经开过一次宽度的终端,彩色输出的字符串长度会因为转义码膨胀好几倍,console.log后注意看是否折行。

第三组:width 从 80 改到 120

120 宽的字符画,每个字符对应的采样区更小,细节明显更丰富,建筑窗户的格子都能大致分辨出来。但一个副作用出现了:画面高度按比例变大,我这块 1920x1080 的屏幕跑满 24 行终端高度时,得往上滚动一下才能看到全貌。这提醒我一个实用的点——如果你要用字符画做"一屏展示",最好提前算好width和期望行数,别让图比自己可视区还高。

5.3 输出保存为文件与日志场景

字符画的精髓在于它是一个纯字符串,所以它天然可以入库、入日志、入文件。

我自己比较常用的一个操作是,把转换结果写入文本文件:

node script.js > art.txt

或者直接写文件:

const fs = require("fs"); const { imgToAscii } = require("img-ascii-term"); (async () => { const art = await imgToAscii({ imgSrc: "./demo.png", color: false }); fs.writeFileSync("./art.txt", art, "utf-8"); })();

黑白模式下,这个art.txt在任何平台用cattypeGet-Content打开都可以查看。彩色模式下,art.txt里会包含一堆 ANSI 转义码,在支持 VT 的终端里cat art.txt依然能显示出彩色字符画,也算一种"图片存储"的野路子,挺好玩的。

6. 踩坑实录:Windows PowerShell、终端颜色、间距与性能

6.1 坑一:Windows 下颜色不生效

我把相同的一段彩色转换代码放到 Windows 11 的 Windows Terminal 里跑,颜色正常。但同样的代码,如果改在默认的 PowerShell 5.1(打开的是旧版 conhost 窗口)里运行,你会发现,console.log出来的内容是一堆←[38;2;...m这样的乱码。

这不是库的问题,是 Windows 传统控制台默认不处理 ANSI 转义序列。Node.js 进程在 Windows 上输出 ANSI 转义码时,系统底层是否把它们解析为颜色,取决于控制台窗口是否启用了 VT 处理(Virtual Terminal Processing)。

排查和处理链路如下:

  1. 先确认你在哪个终端里跑。优先使用 Windows Terminal(Win11 自带),它默认支持 ANSI。
  2. 如果必须在传统控制台里跑,可以尝试在启动 Node 进程前,用cmd /c "echo on"之类的方式开启 VT?——这个不一定每次都有效。更可靠的方案是检查 Node 进程的process.stdout.isTTY是否为true,以及给 Node 进程传入--enable-vt相关参数。但按我的实测经验,最省事的做法还是换终端。
  3. 也可以用 Windows PowerShell 5.1+ 配合 Windows Terminal 宿主,基本不会出问题。

一句话总结:Mac 和 Linux 用户放心用彩色;Windows 用户请优先保证自己打开的是 Windows Terminal 或 VS Code 集成终端。

6.2 坑二:字符画被"压扁"或"拉长"

这个坑很隐蔽。我在 Windows Terminal 上跑出来的字符画,总感觉比 Ubuntu 上的"胖"了一圈。

原因我之前提过:img-ascii-term默认fontRatio2——也就是默认假设终端字体高度是宽度的 2 倍。但不同终端、不同字体、不同字号下,这个比值是浮动的。Windows Terminal 的默认字体 "Cascadia Mono" 的比例更接近 1.8,而 Ubuntu 的默认 Monospace 字体更接近 2.0~2.1。

如果你发现输出的图横向偏胖,把fontRatio往大调(比如2.2);反过来如果纵向拉长像面条,就往小调(比如1.8)。这个参数调整没有绝对值,取决于你当前终端的字体渲染,多试几次就有经验了。

6.3 坑三:大图与动图处理时的性能与卡顿

把一个 10MB 的 PNG 丢进去转换,你会发现 Node 进程的内存占用瞬间飙高,转换耗时也明显变长。原因在于图片解码后像素数据全部保存在内存里,采样过程又需要遍历像素矩阵。

优化思路有两条:

  1. 先用图片处理工具把原图缩放(但这样会多一步操作)。
  2. 调大divideXdivideY,减少采样密度,效率和输出尺寸同时改善。

GIF 动图的情况更特殊。img-ascii-term对有动画的 GIF 的处理方式是抽帧输出的——它会解析出 GIF 的帧数据,但转换结果可能只有第一帧或者某一帧的内容。如果你需要的是"在终端里播放动图",这个库本身不是干这个的,至少需要配合定时器手动换帧刷新,我在下一节会给出一个简单的实现思路。

6.4 终端兼容性速查表

环境黑白模式彩色模式推荐
Linux GNOME Terminal正常正常彩色即可
macOS Terminal.app正常正常(部分老版本可能只支持 256 色)彩色即可
VS Code 集成终端正常正常彩色即可
Windows Terminal正常正常彩色即可
Windows 传统 conhost(PowerShell 5.1)正常乱码风险高只用黑白模式或换 Windows Terminal
SSH 连接远程的纯文本终端正常视远端终端支持而定建议黑白

7. 实战进阶:怎么把字符画玩出花来

7.1 让"动图"在终端里放起来

虽然库本身不支持 GIF 动图的逐帧播放,但你完全可以借助 JavaScript 层的定时器实现"终端动画"。

思路是:把 GIF 的每一帧都转成字符画字符串,然后用console.clear()setInterval每秒刷新几次屏幕。核心代码如下:

const { imgToAscii } = require("img-ascii-term"); const frames = ["./frame1.png", "./frame2.png", "./frame3.png", "./frame4.png"]; let idx = 0; setInterval(async () => { const art = await imgToAscii({ imgSrc: frames[idx % frames.length], color: true, width: 60 }); console.clear(); console.log(art); idx++; }, 200);

这个方案本质上是把"动图"拆成静态帧序列进行轮播。虽然做不到 GIF 原生的流畅度,但十几帧的简单动画在终端里完全可用。刷新的频率建议 200ms 左右,也就是 5FPS,太快的话终端刷新跟不上,还会造成闪烁。

7.2 嵌入 CLI 日志系统

如果你维护着 CLI 工具,可以在关键位置用字符画做视觉提示。比如下载任务完成时,打一个完成的"大勾"图片字符画;报错时打一个醒目的红色告警字符画。这种效果比单纯的文字色块更抓眼球。

实现上要注意:彩色字符画的 ANSI 转义码会和日志的颜色设置互相干扰。我建议这种场景下在转换前把日志系统的颜色输出临时关闭,或者将字符画输出在独立的、不走日志系统的位置。

7.3 自定义字符集:黑白模式的可玩性

img-ascii-term的黑白模式字符集是内置的,但如果你对效果有特殊要求,可以自己在拿到灰度数据后做二次映射。不过更轻量的做法是:在黑色/白色模式下,用库自带的参数组合调出不同质感。

举例来说:

  • 输出文字风格很强烈:"@%#*+=-:. ",暗部细节丰富。
  • 输出简约线条风格:把divideXdivideY调大,字符画的颗粒感变小,整体更"糊",但粗看更接近原图的色块感。

这两种风格没有好坏,取决于你拿它做什么。如果是给终端演示文稿做插图,我倾向于颗粒感小、颜色干净的输出;如果是做聊天代码块的装饰图,颗粒感强一点反而更有味道。

7.4 与现有 CLI 工具链结合

最后分享一个我常直接用的组合场景——把img-ascii-term塞进一个通用的图片预览命令里。

node -e " const { imgToAscii } = require('img-ascii-term'); const path = process.argv[1]; imgToAscii({ imgSrc: path, color: true, width: 100 }).then(console.log); " demo.png

把它写成全局 npm script 或者 shell 别名之后,就相当于在命令行里拥有了一个基于 Node.js 的跨平台图片预览器。虽然不是每个库都能做到,但在受限的终端环境里,这个能力是真的能救急的。

根据我个人的使用经验,img-ascii-term最打动我的地方不是功能多,而是它把一件"看起来像玩具"的事情做到了真正可用的工程水准。你不需要懂图片解码、不需要学 ANSI 转义序列、不需要关心不同终端的差异,几乎零成本就能把图片带进命令行世界。如果让我再给你一个建议:第一次跑的时候,用一张颜色分明、构图简单的图做测试,先跑黑白确认轮廓,再开彩色看效果,最后根据终端实际宽度微调widthfontRatio,这套流程下来,基本就不会踩到什么大坑了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询