新闻详情

新闻详情

首页 / 资讯中心 / 详情

在浏览器终端里显示图片:wterm Kitty图像协议与Canvas覆盖层实战

发布时间:2026/9/28 20:41:43来源:尧图网络
在浏览器终端里显示图片:wterm Kitty图像协议与Canvas覆盖层实战
在浏览器终端里显示图片wterm Kitty图像协议与Canvas覆盖层实战【免费下载链接】wtermA terminal emulator for the web项目地址: https://gitcode.com/gh_mirrors/wterm1/wtermwterm 是一个面向 Web 的终端模拟器terminal emulator for the web核心用 Zig 编写并编译为约 26 KB 的 WASM渲染层直接落在 DOM 上。它通过Ghostty 内核 Canvas 覆盖层实现了 Kitty 图像协议Kitty Graphics Protocol让你在浏览器里直接显示 PNG / RGB / RGBA 图片——配合kitten icat等工具即可体验完整的流式图片传输。什么是 Kitty 图像协议浏览器终端为什么需要它传统终端只认字符。想在终端里看图历史上要么用 Sixel 这种私有协议要么用 Unicode 块字符“拼”出图效果很差。Kitty 终端提出的 Kitty Graphics Protocol 是目前的事实标准应用通过一组转义序列把图片数据支持直接传输 PNG、RGB、RGBA或文件、共享内存引用“推送”到终端终端负责解码并在屏幕上摆放。主流本地终端如 Kitty、Ghostty、WezTerm 都已支持。对浏览器终端来说难点在于像素不是文本不能塞进字符网格图片会随滚动、resize、主/备屏切换而移动必须防止恶意输出耗尽浏览器内存。wterm 的方案是内核负责协议解码DOM 层用一个独立的 Canvas 覆盖层负责绘制两者解耦。快速上手启用 Kitty 图片渲染wterm 采用可插拔内核设计。内置的轻量 Zig 内核会安全地消费 Kitty APC 数据但不渲染图片要显示图片需要换用wterm/ghostty内核基于 libghostty 编译全 VT 特性详见 ghostty 包说明。import { WTerm } from wterm/dom; import { GhosttyCore } from wterm/ghostty; const core await GhosttyCore.load(); const term new WTerm(document.getElementById(terminal), { core, maxImageWidth: 640, // 渲染宽度上限CSS 像素 maxImageHeight: 480, // 渲染高度上限 }); await term.init();React、Vue、Svelte 绑定同样支持core、maxImageWidth、maxImageHeight三个属性框架切换零成本。完整接入示例见 Ghostty 文档和 React 文档。 一个细节WTerm会从浏览器视口回答 Kitty 的像素几何查询CSI 14 t/CSI 16 t所以kitten icat --transfer-modestream image.png可以在传输前协商好显示尺寸避免传回一张远超屏幕的大图。Canvas 覆盖层wterm 如何把图片画进终端核心绘制逻辑集中在 GraphicsLayer 类中工作机制值得初学者了解独立图层容器内创建.term-images图层和.term-image-flow-spacer占位元素图层设置aria-hidden、不可聚焦、鼠标穿透不干扰文本选区、复制、键盘输入和无障碍行为按需绘制每帧从内核读取归一化的图形状态getGraphicsState()和可见图片像素getGraphicsImage()只对可见区域内的 pinned 摆位创建或复用 Canvas离屏的图片立刻释放缓存复用同一张图被多个摆位引用时共享一份解码数据通过引用计数自动回收内存护栏所有可见 Canvas 的 backing store 共享32 MiB预算且单张 Canvas 不超过 32768 像素边长超限的摆位直接跳过绝不允许终端输出任意决定浏览器内存。┌─ 终端容器 ─────────────────────────┐ │ 文本行DOM负责选区/复制/无障碍 │ │ ┌──────────┐ │ │ │ Canvas │ ← 覆盖层鼠标穿透 │ │ └──────────┘ │ └──────────────────────────────────┘图片跟随滚动视口、scrollback 与提示符排布Canvas 覆盖层最常见的翻车点是“图片不跟滚动走”。wterm 的处理跟随滚动与 resize每帧根据视口scrollTop、rowHeight、charWidth等重新定位 Canvasscrollback 中的图片在滚回可见区时会重新挂载滚出即卸载主/备屏切换切换vim/less使用的备用屏时图形状态整体失效覆盖层同步清空提示符不被图片盖住⭐自动尺寸implicit摆位在元数据中占据 0 行内核的光标仍会前进。wterm 通过 reconcileFlowReservations 在视觉 DOM 流中为图片预留渲染高度保证图片下方的 shell 提示符始终显示在图片下面而不是被“画穿”。关键配置限制图片大小与内存占用选项作用默认值maxImageWidth/maxImageHeight渲染尺寸上限CSS 像素只等比缩小、不放大不限imageStorageLimit每屏解码后的 Kitty 图片字节预算设为0可整体关闭图形32 MiBCanvas 总预算所有可见 Canvas 共享32 MiB固定护栏对应源码ghostty-core.ts、graphics-layer.ts。图形内核的契约定义getGraphicsState/getGraphicsImage可选方法见 core 包文档与 API 参考。支持边界哪些图片能用哪些不行明确边界有助于合理选型 ✅支持direct 传输的 PNG / RGB / RGBA 图片含自动尺寸stream摆位❌不支持Sixel、iTerm2/OSC 1337、动画、虚拟 Unicode 摆位、文件 / 共享内存 / URL 类媒体、图片持久化图片随屏幕状态是瞬态的被清屏即消失。非 direct 媒体会在触碰文件或共享内存之前被拒绝——这是浏览器安全的重要考量。相关文件与延伸阅读覆盖层绘制实现graphics-layer.tsGhostty 内核协议解码 WASM 补丁packages/wterm/ghostty/构建补丁说明见 README官方文档Ghostty 内核、原生 JS 集成、配置项端到端测试参考e2e 测试集总结wterm 用“Ghostty 内核解码 Canvas 覆盖层绘制 双重内存预算”的组合拳把 Kitty 图像协议完整搬进了浏览器且滚动跟随、提示符排布等体验细节都做了处理——如果你在做一个 Web IDE、SSH 网关或在线实验室这就是开箱即用的浏览器终端图片方案。【免费下载链接】wtermA terminal emulator for the web项目地址: https://gitcode.com/gh_mirrors/wterm1/wterm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

JavaWeb宿舍管理系统实战:从JSP+Servlet+MySQL到部署排错全攻略 2026/9/28 21:28:07

JavaWeb宿舍管理系统实战:从JSP+Servlet+MySQL到部署排错全攻略

简介:基于JSP与Servlet实现的宿舍管理系统,是一份适合JavaWeb课程设计、毕业设计及初学者实战练习的完整项目源码包。系统涵盖用户管理、宿舍分配、资源预订等常见模块,通过典型的MVC分层展示JSP页面、Servlet控制器与后台JavaBean的协作方式…

阅读更多 →
STM32驱动TMC2209 UART通信实战:CRC校验与寄存器读写详解 2026/9/28 21:28:07

STM32驱动TMC2209 UART通信实战:CRC校验与寄存器读写详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
迪文T5L平台C51开发实战:双核架构、DGUS变量地址与工程化避坑指南 2026/9/28 21:28:00

迪文T5L平台C51开发实战:双核架构、DGUS变量地址与工程化避坑指南

1. 迪文T5L平台选型与整体架构拆解1.1 为什么是T5L加C51这套组合第一次接触迪文T5L平台的开发者,最常问的一个问题就是:都什么年代了,为什么还要用C51?我刚开始也有这个疑惑,毕竟现在随便一颗Cortex-M0都比传统8051内核…

阅读更多 →
别让探棒拖后腿:示波器探棒选型、校准与替代方案全解析 2026/9/28 21:27:59

别让探棒拖后腿:示波器探棒选型、校准与替代方案全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
迪文T5L平台C51与DGUS实战:从零搭建工程到ICL素材处理 2026/9/28 21:27:59

迪文T5L平台C51与DGUS实战:从零搭建工程到ICL素材处理

1. 为什么T5L平台值得单独写一篇实战指南迪文的T5L芯片在工业串口屏圈子里算是一个分水岭式的产品。早些年做串口屏项目,要么用指令集屏,发一堆十六进制指令去画控件,改个界面就得重新算坐标;要么用组态软件生成配置,灵…

阅读更多 →
RISC-V在AI算力爆发下的破局逻辑与进阶路径 2026/9/28 21:27:52

RISC-V在AI算力爆发下的破局逻辑与进阶路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉