当前位置: 首页 > article >正文

代码转图片怎么实现:代码高亮卡片生成方法

最近在做文章后台时我遇到一个很实际的问题编辑器里的代码块虽然能正常显示但要拿去做分享图、封面图或者文档配图时就不太合适了。一开始我试过手动截图但这种方式效率低而且样式不统一。代码只要改一行就得重新截一次。后来我把一个代码转图片接口接进服务里直接把代码片段渲染成 SVG 卡片需要静态图时再转成 PNG。这样一来代码转图片、代码截图生成、页面展示这几件事就串起来了。1. 我在什么场景下接了这个接口我这次接这个接口核心就是为了解决代码转图片需求。具体场景主要有这几类技术文章里的代码配图分享页里的代码高亮卡片开发者工具结果页的静态展示后台内容生产时的统一素材输出这些场景的共同点很明确代码是拿来展示的不是拿来编辑的。如果只是普通页面里的代码块前端高亮库就够用了但如果要做封面图、分享卡片、静态素材普通代码块并不适合直接使用。这时候就需要一个稳定的代码转图片方案。从实际落地看这类需求本质上也可以叫代码截图生成。只是和手动截图不同接口式的代码截图生成更稳定样式也更统一后续替换内容也更方便。2. 这个接口能做什么这个接口本质上就是一个代码转图片服务也可以理解成code to image。你传入代码、语言、主题、标题之后它会返回渲染好的 SVG 结果部分情况下还能拿到 PNG 数据。我这边实际调通后拿到的返回结构大致是这样{code:200,desc:success,data:{language:typescript,theme:aurora,theme_name:Aurora Glow,title:snippet.ts,line_count:1,truncated:false,width:760,height:172,code_length:28,png_supported:true,scale:2,content_type:image/svgxml,svg:?xml version1.0 ... /svg,png_base64:,png_bytes_length:0,available_themes:{aurora:Aurora Glow,sunset:Sunset Peach},supported_languages:[auto,python,javascript,typescript,json,bash,go,rust]}}对我来说这种代码转图片接口里最关键的字段有这些svg最核心适合直接嵌到页面里png_base64有值时可以直接生成 PNG 文件language确认语法高亮有没有命中theme/theme_name适合做主题切换width/height方便前端控制展示尺寸line_count可以限制超长代码truncated判断内容有没有被截断available_themes前端做主题选择时很好用supported_languages前端和后端都能拿来做参数校验从业务用途上看这个接口比较适合下面几类代码截图生成场景技术文章里的代码配图代码高亮卡片生成分享页里的静态代码图文档系统里的代码截图生成工具结果页里的代码转图片输出3. 接口调用流程整个代码转图片流程不复杂就是把代码内容传给接口再根据返回结果决定是直接展示 SVG还是继续生成 PNG。提交代码内容传语言主题标题调用代码转图片接口返回 SVG 或 PNG 数据页面展示或文件落地请求示例这个接口支持三种请求方式GET queryPOST formPOST JSON我在项目里直接用POST JSON因为后端调用更方便也更适合这类代码截图生成服务。POST /api/code-beautify HTTP/1.1 Host: v1.apizero.cn Content-Type: application/json { code: const sum (a, b) a b;, language: typescript, theme: aurora, title: snippet.ts }返回结果示例下面是我这边调试成功后整理过的精简版返回{code:200,desc:success,data:{language:typescript,theme:aurora,theme_name:Aurora Glow,title:snippet.ts,line_count:1,truncated:false,width:760,height:172,png_supported:true,content_type:image/svgxml,svg:?xml version1.0 ... /svg,png_base64:}}调用逻辑我在服务里一般按这个顺序处理整个代码转图片流程接收代码内容、语言、主题、标题调用代码转图片接口先判断code 200再判断data.svg是否存在页面展示时优先返回 SVG分享图输出时再处理 PNG如果从搜索词角度理解这一步其实就是把“代码截图生成怎么调用”落实成一条标准服务链路。4. Node.js 调用代码下面这段是我实际会放进项目里的写法TypeScript axios可以直接运行。这段代码本质上就是一个最小可用的代码转图片示例。importaxiosfromaxios;importfsfromnode:fs/promises;typeRenderCodeImageResp{code:string;desc:string;data?:{language:string;theme:string;theme_name:string;title:string;line_count:number;truncated:boolean;width:number;height:number;code_length:number;png_supported:boolean;scale:number;content_type:string;svg:string;png_base64:string;png_bytes_length:number;available_themes?:Recordstring,string;supported_languages?:string[];};};asyncfunctionrenderCodeImage(){consturlhttps://v1.apizero.cn/api/code-beautify;constpayload{code:[import axios from axios;,const sum (a: number, b: number) a b;,console.log(sum(1, 2));].join(\n),language:typescript,theme:aurora,title:snippet.ts};const{data}awaitaxios.postRenderCodeImageResp(url,payload,{headers:{Content-Type:application/json},timeout:20000});if(data.code!200||!data.data?.svg){thrownewError(render failed:${data.desc});}constresultdata.data;awaitfs.writeFile(./snippet.svg,result.svg,utf8);if(result.png_base64){constpngBufferBuffer.from(result.png_base64,base64);awaitfs.writeFile(./snippet.png,pngBuffer);}console.log({title:result.title,language:result.language,theme:result.theme,lineCount:result.line_count,size:${result.width}x${result.height},truncated:result.truncated,pngSupported:result.png_supported});}renderCodeImage().catch((err){console.error(err);process.exit(1);});安装依赖npminstallaxios如果你是第一次做代码截图生成这段代码已经足够拿来做本地调试了。如果你是要把代码转图片接进正式业务后面再补缓存、转存、鉴权就行。5. 返回结果怎么处理代码转图片能不能真正接进业务关键不在“能不能出图”而在“出图之后怎么用”。这一段其实也是代码截图生成最容易踩空的地方。页面展示优先用 SVG如果你的场景是技术文章帮助文档知识库页面后台预览页我建议优先用svg。因为在大多数代码转图片场景里SVG 比 PNG 更适合页面内展示。原因很直接清晰度高缩放不糊页面里直接可用不需要额外截图尤其是做代码高亮卡片时SVG 非常适合这种代码截图生成需求。静态输出再决定要不要转 PNG如果你的场景是分享图海报素材消息卡片上传对象存储那就要重点看png_base64。我这边实测时发现接口虽然返回了png_supported: true但png_base64可能为空。所以我的处理方式不是强依赖 PNG而是分两层png_base64有值直接写成 PNG 文件png_base64为空先保存 SVG再走自己的 SVG 转 PNG 逻辑这样做的好处是整条代码转图片链路更稳代码截图生成不会因为某次没回 PNG 就直接失败。参数校验先把无效输入拦住这类代码转图片接口虽然偏展示型但参数最好提前收紧。我一般会先校验code不能为空language是否在支持列表里theme是否在可选主题里title是否为空代码长度是否超出限制特别是supported_languages和available_themes很适合直接给前端做下拉项和表单校验。如果你的业务后面还有导出、分享、分发那前面这一步参数校验对代码截图生成体验影响很大。长代码处理避免图片过长做代码截图生成时最常见的问题不是调不通而是生成出来的图太长不适合分享或展示。所以我一般会结合这几个字段处理line_count超过阈值时提示只截重点代码truncated true时展示“内容已截断”width/height超出预期时不走分享图链路这样可以避免生成一张很长但并不好用的代码转图片结果。异常处理失败时回退到代码块我这边会重点兜住这些情况code ! 200data为空svg为空png_base64为空接口超时网络波动如果图片生成失败我通常会退回原始代码块展示而不是让内容页直接空掉。对于线上业务来说这一点很重要。因为代码转图片失败不应该拖垮正文展示代码截图生成只是增强能力不该成为单点问题。6. 实际使用场景从我自己的接法看代码转图片最适合下面几类业务而且这些场景本身也都很适合做代码截图生成。技术文章里的代码配图有些代码片段主要是给读者看思路不一定要复制执行。这时候直接生成代码高亮图片比手动截图更统一也方便后面替换。这是我最常用的代码转图片场景之一。开发者工具结果展示如果你的工具会输出 SQL、脚本、配置片段、前端代码示例这类结果很适合直接走code to image把文本结果变成可分享素材。这类页面做代码截图生成后观感会明显比纯文本好很多。分享页和活动页很多页面只需要一张“代码效果图”并不需要交互代码块。这时候直接生成 PNG 或 SVG会比手动截图稳定得多。这也是很典型的代码转图片落地方式。文档系统和知识库对于固定示例代码不需要在线编辑只需要稳定展示。直接渲染成 SVG 卡片可以减少前端高亮依赖也方便统一样式。如果你的文档里代码比较多那这种代码截图生成方式会非常省事。7. 小结这次把代码转图片接进项目后我最直观的感受是它解决的不是“代码怎么高亮”而是代码怎么变成可展示、可分发、可复用的素材。如果你的项目里本来就有技术文章、开发者工具、分享图或者文档系统这类代码转图片能力会比较顺手。整体看下来代码截图生成的调用方式不复杂返回字段也比较直接尤其是svg、line_count、available_themes这几个字段实际接起来很好用。

相关文章:

代码转图片怎么实现:代码高亮卡片生成方法

最近在做文章后台时,我遇到一个很实际的问题:编辑器里的代码块虽然能正常显示,但要拿去做分享图、封面图或者文档配图时就不太合适了。 一开始我试过手动截图,但这种方式效率低,而且样式不统一。代码只要改一行&#x…...

手机号定位终极指南:3分钟搭建免费归属地查询系统

手机号定位终极指南:3分钟搭建免费归属地查询系统 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://gitcode.com/gh_mirrors/…...

论文AI率从50%降到10%:4个实用方法+3个高效技巧

辛辛苦苦写完的论文,一查AI率直接飙到50%,但学校要求必须控制在10%以内,是不是瞬间感觉之前的熬夜都白搭了?改来改去AI率没降多少,头发反而掉了一大把?别着急,今天就把我亲测好用的降AI率全攻略…...

Win10网络适配器里WLAN神秘消失?我整理了这7个真正管用的修复姿势

Win10网络适配器WLAN消失的深度修复指南:从症状到根源的7种解决方案 当WLAN选项从Win10的网络适配器中神秘消失时,大多数用户会陷入反复重启和盲目尝试的困境。本文将带您深入理解这一现象背后的系统机制,并提供一套从简单到复杂的阶梯式解决…...

[leetcode] 25. K 个一组翻转链表 Reverse Nodes in k-Group

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值&a…...

ReportPortal与JIRA集成:如何无缝连接测试与开发工作流

ReportPortal与JIRA集成:如何无缝连接测试与开发工作流 【免费下载链接】reportportal Main Repository. ReportPortal starts here - see readme below. 项目地址: https://gitcode.com/gh_mirrors/re/reportportal 在现代软件开发中,测试管理与…...

ChatGPT 2023年5月更新解读:iOS App上线,从网页产品扩展到移动端

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

ZYNQ PL端纯Verilog逻辑固化踩坑记:为什么我的bit文件烧不进Flash?

ZYNQ PL端逻辑固化深度解析:从硬件启动原理到避坑实践 第一次尝试在ZYNQ上固化纯PL端逻辑时,很多工程师都会遇到一个令人困惑的现象——明明在普通FPGA上能轻松实现的bit文件烧录,到了ZYNQ平台却屡屡失败。这背后隐藏着ZYNQ芯片独特的启动机制…...

5分钟免费获取网易云音乐无损FLAC:终极批量下载工具完全指南

5分钟免费获取网易云音乐无损FLAC:终极批量下载工具完全指南 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为无法离线享受高品质音乐…...

ChatGPT 2023年3月14日更新解读:GPT-4接入Plus,正式进入GPT-4时代

🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...

aioquic未来展望:QUIC v2、WebTransport等新技术趋势的完整指南

aioquic未来展望:QUIC v2、WebTransport等新技术趋势的完整指南 【免费下载链接】aioquic QUIC and HTTP/3 implementation in Python 项目地址: https://gitcode.com/gh_mirrors/ai/aioquic 在当今互联网技术快速发展的时代,网络协议正在经历一场…...

ESP32-CAM上传图片总失败?排查HTTP POST到巴法云的5个常见坑(WiFi、电源、引脚)

ESP32-CAM图片上传失败排查指南:从硬件到平台的5大关键点 当你满怀期待地将ESP32-CAM对准拍摄对象,却发现图片始终无法上传到巴法云时,那种挫败感我深有体会。这不是一个简单的"复制粘贴代码就能运行"的项目,而是一个需…...

本地化部署AI做表格工具评测:数以轻舟Agent技术架构与落地实践

一、产品定位与核心架构数以轻舟Agent是一款面向Excel数据处理场景的垂直型AI智能体,由北京乾策数智科技有限公司开发,2025年12月推出首款产品,2026年5月正式上线本地化部署版本。产品核心定位并非通用AI助手,而是聚焦"AI做表…...

12种加密音乐格式一键解密:Unlock Music开源工具完全指南

12种加密音乐格式一键解密:Unlock Music开源工具完全指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: ht…...

sqlite-utils与Datasette集成:构建数据驱动的Web应用终极指南

sqlite-utils与Datasette集成:构建数据驱动的Web应用终极指南 【免费下载链接】sqlite-utils Python CLI utility and library for manipulating SQLite databases 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-utils sqlite-utils是一款强大的Pytho…...

STM32CubeMX 实战指南:LL库外部中断配置与按键响应优化

1. STM32CubeMX与LL库外部中断入门 第一次接触STM32外部中断时,我被它的响应速度惊艳到了。相比轮询方式,中断能让CPU在按键按下瞬间立即响应,就像有个24小时待命的管家。STM32CubeMX这个图形化配置工具,把原本需要手动编写的底层…...

ExplorerPatcher完整指南:轻松定制Windows界面,打造专属工作环境

ExplorerPatcher完整指南:轻松定制Windows界面,打造专属工作环境 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为…...

PyCharm配置PyQt5开发环境:一站式集成Qt Designer、PyUIC与PyRcc实战指南

1. 环境准备与基础安装 第一次用PyCharm搞PyQt5开发时,我对着满屏的英文文档差点放弃。后来发现只要搞定这三个核心工具链——Qt Designer画界面、PyUIC转代码、PyRcc管资源,开发效率能翻倍。先说最基础的安装,别被那些复杂的配置吓到&#x…...

LinkedOM与JSDOM性能对比:10倍速度提升的秘诀

LinkedOM与JSDOM性能对比:10倍速度提升的秘诀 【免费下载链接】linkedom A triple-linked lists based DOM implementation. 项目地址: https://gitcode.com/gh_mirrors/li/linkedom 在现代Web开发中,DOM解析和操作性能直接影响应用响应速度。Lin…...

VIIRS/NPP夜光数据:从数据获取到区域分析的实用指南

1. VIIRS/NPP夜光数据入门指南 第一次接触VIIRS/NPP夜光数据时,我也被各种专业术语和数据产品搞得晕头转向。这种由美国国家海洋和大气管理局(NOAA)提供的夜间灯光遥感数据,已经成为城市发展、能源消耗和经济活动研究的重要数据源…...

5分钟快速上手:免费高效的B站视频解析终极方案

5分钟快速上手:免费高效的B站视频解析终极方案 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否曾想保存喜欢的B站视频却苦于找不到合适的工具?bilibili-parse作为一款开…...

CANN/ops-nn LpLoss算子

LpLoss 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atl…...

Equalizer APO完整教程:免费系统级音频均衡器从入门到精通

Equalizer APO完整教程:免费系统级音频均衡器从入门到精通 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo Equalizer APO是一款功能强大的免费开源系统级音频均衡器软件,能够为W…...

为什么Windows界面定制工具能让你找回高效工作节奏?

为什么Windows界面定制工具能让你找回高效工作节奏? 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 当我们习惯了多年的Windows操作…...

Unlock Music:打破音乐平台格式壁垒的终极浏览器解密工具

Unlock Music:打破音乐平台格式壁垒的终极浏览器解密工具 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: ht…...

SDR++:跨平台无线电接收软件入门实战指南

SDR:跨平台无线电接收软件入门实战指南 【免费下载链接】SDRPlusPlus Cross-Platform SDR Software 项目地址: https://gitcode.com/GitHub_Trending/sd/SDRPlusPlus 想要探索软件定义无线电的奇妙世界却不知从何入手?SDR作为一款轻量级、跨平台的…...

Spring Boot项目集成GitLab OAuth登录保姆级教程(含完整代码)

Spring Boot项目集成GitLab OAuth登录生产级实践指南 企业级应用开发中,统一身份认证是基础架构的关键环节。GitLab作为主流的代码托管平台,其OAuth服务为开发者提供了便捷的第三方登录解决方案。本文将深入探讨如何在Spring Boot项目中实现生产级的GitL…...

掌握Windows风扇控制:FanControl软件从零到精通指南

掌握Windows风扇控制:FanControl软件从零到精通指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…...

CANN/asc-devkit NodeIoNum API文档

NodeIoNum 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/…...

从NIST到Interatomic Repository:金属体系L-J势参数高效检索与验证指南

1. 金属模拟中的L-J势参数为何如此重要 我第一次用LAMMPS模拟镁合金拉伸过程时,发现结果和实验数据差了十万八千里。折腾了两周才发现问题出在Lennard-Jones势参数上——当时随便找了个文献值就用,结果模拟出的晶格常数比实际小了15%。这个教训让我明白…...