V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
pDJJq
V2EX  ›  程序员

curl 的小妙用, 在终端里展示 gif / image / markdown

  •  
  •   pDJJq · 4 天前 · 3860 次点击

    昨天发布了一个在终端里展示个人资料的小玩意 https://www.v2ex.com/t/1176162

    但是有些朋友评论说: "不够帅, 不够帅"

    熬了一个通宵, 现在更新支持 GIF / IMAGE / Markdown , 绝对能满足大部分的创作需求了.

    效果展示:

    在线体验:

    命令行里运行: curl -N me.pdjjq.org

    我实在不知道该起什么名字, 最开始是想要做一个有意思的展示简历的小玩意. 但是现在感觉只会变成一堆蔡徐坤/奶龙的 gif.

    38 条回复    2025-12-03 18:30:50 +08:00
    Alias4ck
        1
    Alias4ck  
       4 天前
    建议多看看 ascii art
    另外你这个还需要网络( 完全没必要啊 直接做成 cli 不行?
    Mark24
        2
    Mark24  
       4 天前
    挺有意思的,感谢主包
    Kaisar
        3
    Kaisar  
       4 天前
    刷新率跟不上
    cmos
        4
    cmos  
       4 天前
    这个很有意思,看了一下原理和设计,用 Golang 更健壮一些,包括内容和图像的可变化性。time.Ticker 配合 goroutine ,循环发送。用 fatih/color 或者直接写 escape sequence 也行。
    tsvico
        5
    tsvico  
       4 天前
    今日天气能支持吗
    pDJJq
        6
    pDJJq  
    OP
       4 天前
    @Alias4ck ASCII Art 的表现能力怎么能和图像相比呢? 目的就是在所有的终端里不做任何配置都能显示, curl 就是最好的选择, 谁会去`apt install xxx` 再去运行就只为了看个动态图像呢?
    pDJJq
        7
    pDJJq  
    OP
       4 天前
    @cmos yes, 主要是为了在 cloudfalre worker 里运行. 这样我不需要支付昂贵的服务器费用. 😭
    arfaWong
        8
    arfaWong  
       4 天前
    codehz
        9
    codehz  
       4 天前
    缺少一个垂直同步,我记得可以使用 CSI?2026h 来同步
    Tink
        10
    Tink  
    PRO
       4 天前
    这个比较强,everything

    https://github.com/mmulet/term.everything
    realpg
        11
    realpg  
    PRO
       4 天前
    这是什么原理?
    正常 curl 的输出不是顺序的
    Alias4ck
        12
    Alias4ck  
       4 天前
    @pDJJq 哥们 你 docs 里面写的就是这个啊 图片/GIF 转 ASCII 艺术(支持彩色)
    突然来句怎么和图像对比. 你也没实现图像啊

    真正的图片显示也不是你这种啊 只有支持图片协议的终端才有比如 kitty /ghostty/iterm
    HTravel
        13
    HTravel  
       4 天前
    你如果能理解终端显示的就是一维的字符流,然后通过 ESC 字符切换到控制模式来更改接下来的字体颜色、背景、闪烁、清除当前行、换行什么的,然后各个终端软件自然还能继续扩展,在 ESC 字符切换到控制模式后用另外的命令字来表示接下来的是图片、视频什么的。你就会发现,但凡你 GUI 编程时自绘过组件,就会发现让终端显示这些东西了然无趣,压根没任何技术难点。

    甚至你可以直接解析这个字符流,将其转换为 HTML ,直接在浏览器中看到你想要的效果。HTML/CSS/JS 实现这一切很难么?
    pDJJq
        14
    pDJJq  
    OP
       4 天前
    @Alias4ck #12 还真是
    pDJJq
        15
    pDJJq  
    OP
       4 天前
    @codehz 收到!
    pDJJq
        16
    pDJJq  
    OP
       4 天前   ❤️ 2
    @HTravel

    当前是通过 curl + 控制字符实现的.和 TUI 相比环境相当受限: 单向接收消息, 无系统信息, 网络延迟.

    不如你写个 demo? 给看看怎么通过 curl + Terminal 做更复杂功能. 我对 terminal 以及 termimal 支持的 Graphics Protocol 了解的并不多, 看看你的.
    pDJJq
        17
    pDJJq  
    OP
       4 天前
    @codehz 哥, 我服了. 确实有用. 我顺便也把过去的清屏改成光标复位 refresh 帧, 确实稳定了不少. 非常感谢!
    codehz
        18
    codehz  
       4 天前   ❤️ 1
    @pDJJq 但你开头还是要补充一个清屏,你运行两次可能会有上次输出的残留在缓冲区了
    HTravel
        19
    HTravel  
       4 天前   ❤️ 1
    @pDJJq 我闲的蛋疼玩这种?我之所以清楚,就是因为终端中有些效果与 GUI 中不一致,我为了让我的软件能同时在两种环境下运行且运行效果尽可能一致,才了解了下终端原理。最后发现,终端做到极致,不就是另一个 GUI 吗?那我直接在终端中打开 GUI 界面不就行了嘛。

    我愿意花时间做的软件,都必须是能用一辈子那种。所以数据同步、增备、全备、快照,这类软件我全部自己实现了一遍。以及针对不同数据,比如文本类看小说、音频类听音乐、视频类看影视综艺、剪贴板在能支持浏览器上就能跨设备同步这种,我都给自己写了一套,并且能通过 termux 放到安卓里面完全跑起来,且挂后台不耗电。

    至于其他的,我想想原理就行了,不可能投入时间的,完全不值得。
    pDJJq
        20
    pDJJq  
    OP
       4 天前
    @codehz #18 YES!
    sojourner
        21
    sojourner  
       4 天前   ❤️ 6
    @HTravel 看给你能得,别人搞个小玩具发出来大家乐呵一下,你倒是给装上了。
    Alias4ck
        22
    Alias4ck  
       4 天前
    @HTravel 不妨看看这个,终端里面有趣的还是挺多的

    https://www.a1k0n.net/2011/07/20/donut-math.html
    yeelooyeeuu
        23
    yeelooyeeuu  
       4 天前
    这是什么原理?
    tf2
        24
    tf2  
       4 天前
    虽然猜到原理不难,但是把别人喷一顿是为啥。。。?

    哥伦布有啥厉害的,不就是一个劲儿向西划船么。。对不?
    pDJJq
        25
    pDJJq  
    OP
       4 天前
    @yeelooyeeuu

    通过 terminal 中的控制字符实现的.

    如果你感兴趣可以看看这里: https://en.wikipedia.org/wiki/Control_character

    一些新的 terminal 支持图像协议, 性能和效果会更好, 比如说 kiktty 的: https://sw.kovidgoyal.net/kitty/graphics-protocol/

    我不是实现的高手, 和 claude code + gemini 确定的.
    pDJJq
        26
    pDJJq  
    OP
       4 天前
    @realpg

    通过 terminal 中的控制字符实现的.

    如果你感兴趣可以看看这里: https://en.wikipedia.org/wiki/Control_character

    一些新的 terminal 支持图像协议, 性能和效果会更好, 比如说 kiktty 的: https://sw.kovidgoyal.net/kitty/graphics-protocol/

    我不是实现的高手, 和 claude code + gemini 确定的.
    pDJJq
        27
    pDJJq  
    OP
       4 天前
    Love from DJJ 😘
    HTravel
        28
    HTravel  
       4 天前
    @Alias4ck 这种没啥意思。我以前还在 Excel 绘过画呢,给我任何一张照片,我都能原封不动的画出来。原理很简单,每个单个格看作一个像素,然后用 POI 操作 excel 文档来填充这些单元格的背景即可。

    记得日本还真有人在 Excel 作画,他们把这叫绘画仙人,认为牛逼的不行。我随便出手,就能做祖师爷
    HTravel
        29
    HTravel  
       4 天前
    @Alias4ck 其实终端是有多行组成的,每行又必须是同样高度和宽度的等宽字符。也就是说,终端是可以看作 m x n 列的 Excel 单元格的,且每个单元格中只能放一个字符。原理就这么简单。

    所以,你把 Excel 单元格边框去掉,背景涂黑,然后通过 VBA 操作一个个单元格,你就能模拟出终端软件,以及终端中跑着的这类动态效果。
    windyskr
        30
    windyskr  
       4 天前
    太有趣了
    stillywud
        31
    stillywud  
       4 天前
    大神好多,收藏~
    realpg
        32
    realpg  
    PRO
       3 天前
    @pDJJq #26

    好的 有关键字就行了

    啥时候没事就可以研究一下了

    我只是对各种技术的原理感兴趣 知道一个没事就研究一下
    635925926
        33
    635925926  
       3 天前
    Alias4ck
        34
    Alias4ck  
       3 天前
    @HTravel 太牛了有没有作品让我拜读一下
    (你是 Github 那个拿 Excel 模拟 CPU 的吗?
    Leon6868
        35
    Leon6868  
       3 天前
    @HTravel #19 talk is cheap, show me your code
    HTravel
        36
    HTravel  
       3 天前
    @Alias4ck 如果我说我会用 HTML 或 Java 这类模拟一个 Windows 3.2 的软件 GUI 界面,你们会觉得很牛逼吗?一个 UI 新人也搞得出来啊。

    你们现在觉得牛逼的终端显示动态内容,早在 Windows 3.2 之前就成熟了。但当年大家只会认为 windows 3.2 GUI 是真牛逼,终端 TUI 是真落后。

    你们花点时间了解下终端显示原理,明白它就是无限读一个字符串。其实你自己就能通过 HTML 画布把常见的终端显示效果模拟出来。甚至在终端里面显示图片、音乐、视频都不成问题。真做完这个,你会发现这不就是个功能受限的浏览器嘛。难道在浏览器里面让自己实现字符串、图片、音乐、视频的显示和播放很难?

    甚至现在你都不需要自己写代码。你问下 AI ,终端显示原理是不是把屏幕看作 m x n 的一个个小格子,然后每个格子中只能显示一个字符?你写代码读一串字符串,将每个字符填充到 m x n 的字符数组里,这很难?你可以让 AI 直接给你写出这个终端软件来玩,根本没多少行代码。
    Alias4ck
        37
    Alias4ck  
       3 天前
    @HTravel 太能说了呀, 终端各种 sequence escape 还有各种标准都能整你一壶的, 在你这里听起来都好简单哦
    HTravel
        38
    HTravel  
       3 天前
    @Alias4ck 原理不就这么简单嘛。而且感觉你写的代码输出没怎么兼容过终端吧,否则,这不就是常见的常识嘛。你不了解这些,咋让一条消息同时在 GUI 、HTML 、命令行中都正常显示?

    但你又不是做 TUI ,最多也就是实现多行的同时刷新,类似多线程下载显示进度那种,压根不难。

    当然,现在多数人都是调包侠
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1119 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:55 · PVG 01:55 · LAX 09:55 · JFK 12:55
    ♥ Do have faith in what you're doing.