curl 的小妙用, 在终端里展示 gif / image / markdown - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
pDJJq
V2EX    程序员

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

  •  
  •   pDJJq 14 天前 4165 次点击

    昨天发布了一个在终端里展示个人资料的小玩意 t/1176162

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

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

    效果展示:

    在线体验:

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

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

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

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

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

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

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

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

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

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

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

    哥伦布有啥厉害的,不就是一个劲儿向西划船么。。对不?
    pDJJq
        25
    pDJJq  
    OP
       14 天前
    @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
       14 天前
    @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
       14 天前
    Love from DJJ
    HTravel
        28
    HTravel  
       14 天前
    @Alias4ck 这种没啥意思。我以前还在 Excel 绘过画呢,给我任何一张照片,我都能原封不动的画出来。原理很简单,每个单个格看作一个像素,然后用 POI 操作 excel 文档来填充这些单元格的背景即可。

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

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

    好的 有关键字就行了

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

    我只是对各种技术的原理感兴趣 知道一个没事就研究一下
    635925926
        33
    635925926  
       13 天前
    Alias4ck
        34
    Alias4ck  
       13 天前
    @HTravel 太牛了有没有作品让我拜读一下
    (你是 Github 那个拿 Excel 模拟 CPU 的吗?
    Leon6868
        35
    Leon6868  
       13 天前
    @HTravel #19 talk is cheap, show me your code
    HTravel
        36
    HTravel  
       13 天前
    @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  
       13 天前
    @HTravel 太能说了呀, 终端各种 sequence escape 还有各种标准都能整你一壶的, 在你这里听起来都好简单哦
    HTravel
        38
    HTravel  
       13 天前
    @Alias4ck 原理不就这么简单嘛。而且感觉你写的代码输出没怎么兼容过终端吧,否则,这不就是常见的常识嘛。你不了解这些,咋让一条消息同时在 GUI 、HTML 、命令行中都正常显示?

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

    当然,现在多数人都是调包侠
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3065 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 12:39 PVG 20:39 LAX 04:39 JFK 07:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86