Vibe Coding 实战:用自然语言重写传统软件核心场景
1. 一场“复刻传统软件”的新趋势到底在讲什么第一次听到“Vibe Coding 重写 Adobe”这个说法我脑子里冒出来的画面是一个人对着编辑器敲几句自然语言然后一个能用的图像处理工具就慢慢长出来了。这事放在三年前我会觉得是段子放在今天它已经变成一种值得认真对待的开发范式。所谓 Vibe Coding说白了就是“凭感觉写代码”——你不再一行一行手敲实现细节而是把意图、审美、交互感觉描述给 AI让它生成代码你再通过运行、观察、调整来逼近你想要的效果。它和传统“先设计架构再编码”的路径最大的区别在于反馈回路极短试错成本极低人的角色从“实现者”偏向“导演和验收者”。而“重写 Adobe”这个说法指的并不是真去复刻 Photoshop 那种几千万行代码的庞然大物而是复刻传统软件的核心使用场景图层、蒙版、滤镜、画笔、选区、导出。过去这些能力被封装在厚重的桌面软件里普通人想做一个“只满足自己需求的小工具”门槛高得离谱。现在借助 Vibe Coding一个懂点审美、会描述需求的人可以在一个周末做出一个“够用版”的图像编辑器。这就是这个趋势真正吸引人的地方它把“软件能力”从产品里拆出来变成可以被个人按需重组的东西。我适合谁来读这篇如果你是产品经理、设计师、独立开发者或者只是对“AI 帮我写代码”这件事好奇但一直没动手的人这篇都值得看。因为它讲的不是某个具体工具的教程而是一套可复用的思路怎么把一个传统软件拆成可描述的功能块怎么用自然语言驱动 AI 生成怎么验收和迭代。下面我会从整体设计、核心细节、实操过程、问题排查四个层面把这件事讲透。2. 内容整体设计与思路拆解2.1 为什么是“复刻场景”而不是“复刻软件”很多人一上来就想“我要做一个 Photoshop”这个目标从第一天就注定失败。传统软件是几十年迭代、无数用户反馈堆出来的它的复杂度不是功能多而是功能之间的耦合。图层和蒙版耦合蒙版和选区耦合选区和滤镜耦合牵一发动全身。Vibe Coding 的优势在于快速生成独立功能块劣势在于处理复杂耦合时容易失控。所以正确的思路是先复刻一个具体场景而不是复刻整个软件。举个例子与其做“一个图像编辑器”不如做“一个能批量给商品图加圆角和水印的小工具”。后者场景明确、功能边界清晰、验收标准直观。我试过用这种方式拆解效率比“做大而全”高出好几倍。因为 AI 在生成代码时上下文越聚焦输出质量越稳定。你给它一个模糊的大目标它会给你一堆看起来能用但拼不起来的碎片你给它一个具体的小场景它反而能给你一个完整可跑的闭环。这个思路背后其实是一个很朴素的工程原则降低单次任务的复杂度。传统开发里我们靠模块化、接口设计来降复杂度Vibe Coding 里我们靠“场景切分”来降复杂度。场景就是天然的模块边界而且场景是用户能感知的验收起来不需要懂代码。2.2 技术选型为什么浏览器端是首选复刻传统软件第一个要决定的是跑在哪。桌面端、浏览器端、还是命令行我的经验是浏览器端是 Vibe Coding 复刻传统软件的最优解原因有三个。第一渲染能力现成。Canvas 和 WebGL 把图像处理的底层能力都封装好了你不需要从零写像素操作。AI 生成 Canvas 代码的准确率也明显高于生成原生桌面 GUI 代码因为训练数据里 Web 相关内容占比极高。第二分发和验收成本低。你生成的东西打开浏览器就能看改一行刷新一下就行。桌面端你要处理编译、打包、依赖反馈回路一下子被拉长Vibe Coding 的“快”就废了一半。第三交互组件丰富。滑块、按钮、颜色选择器、文件拖拽这些在 Web 上都有成熟方案AI 也熟悉。你描述“一个可以拖动调整透明度的滑块”它几乎不会写错。但你要是描述“一个原生桌面端的滑块控件”它可能给你一堆平台相关的样板代码。提示选浏览器端不代表不能做重活。WebGL 和 WebAssembly 已经能扛住相当复杂的图像运算日常的滤镜、图层合成完全够用。真正吃性能的是视频实时处理和 3D 渲染那属于另一个话题。2.3 功能拆解的颗粒度怎么把握拆得太粗AI 生成的东西你没法验收拆得太细你会陷入“描述比写代码还累”的困境。我踩过的坑是一开始把“图层系统”当成一个功能块丢给 AI结果它生成了一堆互相矛盾的代码图层顺序、混合模式、透明度全乱套。后来我改成按“用户动作”拆新建图层、切换图层、调整透明度、删除图层每个动作单独生成、单独验收最后再拼起来成功率大幅提升。所以颗粒度的判断标准是一个功能块是否对应一个可独立验收的用户动作。能独立验收就说明边界清晰边界清晰AI 就不容易跑偏。这个标准比“按技术模块拆”更实用因为技术模块之间的依赖关系 AI 未必理解但用户动作是它训练数据里见过无数次的模式。3. 核心细节解析与实操要点3.1 图层系统的本质与最小实现图层是传统图像软件的核心抽象但它的本质其实很简单一个有序的、带透明度的图像堆叠。每个图层是一张独立的画布最终显示结果是所有图层按顺序合成。理解这一点你就能用最少的代码实现它。最小实现需要三个东西一个数组存图层、每个图层带一个 Canvas、一个合成函数按顺序绘制。合成函数的核心逻辑就是遍历数组用globalAlpha控制透明度用globalCompositeOperation控制混合模式依次drawImage。我实测下来这套逻辑不到五十行就能跑起来而且 AI 生成这段代码的准确率非常高因为它就是标准的 Canvas 操作模式。但这里有个容易忽略的细节图层的坐标系。如果你允许图层被拖动、缩放那每个图层就需要自己的变换矩阵。这一步是复杂度陡增的地方。我的建议是第一版先不做图层变换所有图层共享同一个坐标系等核心流程跑通了再加。Vibe Coding 最忌讳的就是一开始就把所有变量都打开那样 AI 生成的代码会互相打架。3.2 选区与蒙版最容易被低估的难点选区看起来简单实际上是个深坑。矩形选区好做套索选区就涉及路径闭合魔棒选区涉及颜色容差算法。我试过让 AI 直接生成“魔棒工具”结果它给了一个基于固定阈值的简单实现边缘锯齿严重稍微复杂点的图就废了。后来我换了个思路不追求算法完美追求交互闭环。先用矩形和椭圆选区把流程跑通让用户能选中、能反选、能羽化蒙版能跟着选区走。等这套跑顺了再考虑加魔棒。因为对大多数“复刻场景”来说矩形选区已经能覆盖八成需求。这就是 Vibe Coding 的取舍哲学先要能用再要好用。蒙版的实现也有个技巧不要真的去改像素而是用一张灰度图作为遮罩合成时用globalCompositeOperation destination-in把遮罩应用上去。这样蒙版是可逆的、非破坏性的用户随时能改。这个模式 AI 也很熟因为它是 Web 图像处理的标准做法。3.3 滤镜链的设计顺序决定结果滤镜是图像软件里最直观的功能但滤镜的应用顺序会显著影响最终效果。比如先锐化再模糊和先模糊再锐化结果完全不同。传统软件用“滤镜栈”来解决这个问题用户可以调整顺序、开关单个滤镜。在 Vibe Coding 里实现滤镜栈关键是把每个滤镜抽象成一个纯函数输入 ImageData输出 ImageData。然后一个循环按顺序调用。这个设计的好处是每个滤镜可以独立生成、独立测试最后拼装。我实测下来这种“纯函数 管道”的模式AI 生成的成功率远高于“一个大函数里塞所有滤镜”。注意滤镜处理大图时容易卡顿因为 Canvas 的getImageData和putImageData是同步操作。我的做法是先把图缩到预览尺寸做实时预览用户确认后再对原图跑一次。这个“预览-确认”模式能显著提升体验而且实现起来不复杂。3.4 导出环节的坑格式与质量导出看起来是最简单的一步其实坑不少。PNG 支持透明JPEG 不支持JPEG 有质量参数PNG 没有WebP 兼容性在变好但仍有例外。我踩过的坑是用户做了带透明背景的图导出成 JPEG 后透明区域变成黑色体验极差。解决办法是在导出前做一次格式检查如果图有透明像素且用户选了 JPEG就提示“JPEG 不支持透明是否改为 PNG 或填充背景色”。这个提示逻辑很简单但能避免大量困惑。另外导出时用canvas.toBlob而不是toDataURL前者是异步的、内存占用更低处理大图时不容易崩。4. 实操过程与核心环节实现4.1 从零搭建一个最小可用图像编辑器我把整个实操拆成五个阶段每个阶段都有明确的验收标准。这套流程我跑过好几遍每次都能在一个周末内出一个能用的版本。第一阶段画布与文件加载。目标是打开网页能看到一个画布能把本地图片拖进去显示。核心代码就是一个canvas加一个FileReader。验收标准拖入一张图画布上能看到它且尺寸自适应。这一步 AI 几乎不会出错十分钟能搞定。第二阶段图层数组与合成。目标是能新建图层、切换图层、调整透明度。核心是把画布渲染逻辑改成“遍历图层数组依次绘制”。验收标准新建一个图层画点东西调整它的透明度能看到叠加效果。这一步的关键是先不做图层拖动只做透明度把合成逻辑跑通。第三阶段基础绘制工具。目标是画笔和橡皮擦。核心是监听鼠标事件在对应图层的 Canvas 上画线。这里有个细节画笔的平滑度靠的是记录上一个点和当前点之间插值而不是直接画点。AI 生成这段时经常漏掉插值导致线条断断续续你需要手动补上。第四阶段选区与裁剪。目标是矩形选区加裁剪。核心是记录选区的起点终点裁剪时用drawImage的九参数版本截取区域。验收标准框选一块区域点裁剪画布只剩那块区域。第五阶段导出。目标是把当前合成结果导出成 PNG。核心是新建一个离屏 Canvas把图层合成上去然后toBlob下载。验收标准导出的图和屏幕上看到的一致。4.2 关键参数的计算与选择有几个参数是绕不开的我把我用的值列出来你可以直接抄。参数推荐值说明画布最大尺寸4096×4096超过这个尺寸浏览器容易内存溢出预览缩放比例0.5实时预览时缩一半性能提升明显画笔最小宽度1px再小就没意义了画笔最大宽度200px再大不如用填充历史记录步数20太多占内存太少不够用导出 JPEG 质量0.92肉眼几乎无损体积可控这些值不是拍脑袋定的是我在实际使用中反复调整出来的。比如历史记录步数我一开始设了 50结果处理大图时内存直接爆掉设成 10 又觉得不够用最后定在 20 比较平衡。画笔最大宽度也是设太大滑块拖动精度就差了。4.3 用自然语言驱动 AI 生成代码的实操技巧这是 Vibe Coding 的核心技能我总结了几个实用技巧。技巧一先描述验收标准再描述功能。比如不要说“给我写一个画笔工具”而要说“我要一个画笔工具验收标准是按住鼠标拖动能画出连续的线松开停止线条颜色和粗细可调”。AI 拿到验收标准后生成的代码会更贴近你的预期。技巧二一次只改一个变量。如果你要同时改颜色、粗细、透明度分三次让 AI 改。一次改多个它容易顾此失彼而且出问题你也不知道是哪个改动导致的。技巧三报错时把完整错误信息贴给它。不要只说“报错了”把控制台的完整堆栈贴过去AI 定位问题的准确率会高很多。我实测下来带堆栈的报错修复成功率在八成以上。技巧四让它解释再让它改。遇到复杂 bug先让 AI 解释这段代码在干什么确认它理解对了再让它改。直接让它改它可能改错地方。提示AI 生成的代码一定要自己跑一遍再合并。我见过太多“看起来对但跑起来错”的情况尤其是涉及异步和事件监听的代码。跑一遍的成本很低但省下的调试时间很多。5. 常见问题与排查技巧实录5.1 图像处理类常见问题速查问题现象可能原因排查方向画布一片空白图片未加载完就绘制检查是否在 onload 回调里绘制图层叠加顺序错乱数组遍历顺序反了确认是从后往前还是从前往后绘制透明区域变黑导出格式不支持透明改用 PNG 或填充背景画笔线条断裂缺少点间插值补上两点之间的线性插值大图操作卡顿同步像素操作阻塞主线程改用预览缩放或 Web Worker撤销后状态错乱历史记录存的是引用不是快照存 ImageData 的深拷贝这张表是我踩坑踩出来的每一条都对应一次真实的调试经历。比如“撤销后状态错乱”这条我一开始存的是 Canvas 引用结果撤销时发现所有历史记录都指向同一个画布全乱了。后来改成存getImageData的深拷贝才解决。5.2 三个独家避坑技巧技巧一给每个图层加唯一 ID。不要用数组下标来标识图层因为删除图层后下标会变所有引用都失效。用自增 ID 或者时间戳虽然多写几行但省下的调试时间远超这点成本。技巧二所有异步操作加 loading 状态。图片加载、滤镜处理、导出这些都是异步的。不加 loading 状态用户会以为卡死了然后疯狂点击导致状态错乱。一个简单的遮罩加转圈能避免大量“玄学 bug”。技巧三先做“重置”按钮再做“撤销”。撤销的实现复杂度远高于重置。第一版先放一个“重置到初始状态”的按钮让用户有退路等核心流程稳了再上撤销。这个顺序能让你更快出一个可用的版本。5.3 性能优化的几个实用手段图像处理最容易遇到性能问题我总结了几个立竿见影的手段。手段一离屏 Canvas 缓存。把不常变的图层画到离屏 Canvas 上合成时直接 drawImage避免重复绘制。这个优化在图层多的时候效果明显。手段二requestAnimationFrame 节流。鼠标移动事件触发频率很高不要每次事件都重绘用 rAF 合并到下一帧。这个改动通常能提升一倍以上的流畅度。手段三分块处理大图。如果必须处理原图尺寸把图切成小块逐块处理每块之间让出主线程避免页面假死。这个实现稍复杂但处理 4K 图时是必须的。注意性能优化不要过早做。先把功能跑通用真实场景测出瓶颈再针对性优化。我见过太多人一上来就搞 Web Worker、搞分块结果功能还没做完就累趴了。6. 这个趋势对个人开发者的实际影响6.1 门槛降低后竞争点转移到了哪里Vibe Coding 把“写代码”这个门槛拉低了但并不意味着做软件变简单了。门槛降低后竞争点转移到了审美、场景理解和验收能力上。同样一个图像工具有人做出来能用但丑有人做出来既好用又好看差距就在审美。同样一个需求有人能拆成清晰的场景有人拆得乱七八糟差距就在场景理解。我个人的体会是AI 生成的代码质量很大程度上取决于你描述需求的清晰度。你描述得越具体、越贴近真实使用场景它生成的东西越靠谱。这其实是一种新的能力把模糊的想法翻译成精确的、可验收的描述。这个能力比会写代码更稀缺也更值钱。6.2 传统软件会被取代吗短期内不会长期看是“分化”。传统软件会继续服务于专业场景因为专业场景需要极致的性能、复杂的协作、深度的功能。但大量“轻度需求”会被个人工具分流。比如“我就想给图片加个水印”以前要装个几百兆的软件现在一个网页工具就够了。这种分流会持续发生而且速度在加快。对个人开发者来说这意味着机会你不需要做一个大而全的产品你只需要解决一个具体的小问题而且解决得足够好。Vibe Coding 让这个“足够好”的实现成本降到了个人可承受的范围。这是我看到这个趋势最积极的一面。6.3 我个人的实操建议如果你现在想动手我的建议是从你自己的工作流里找一个重复劳动开始。不要一上来就做图像编辑器先做“批量重命名文件”“自动整理截图”“一键生成周报模板”这种小工具。跑通一个完整闭环你会对 Vibe Coding 的边界有真实的感知然后再挑战更复杂的场景。另外保留一份“提示词笔记”。把你用过的、效果好的描述记下来下次遇到类似需求直接改改就能用。我攒了半年现在做新工具的速度比一开始快了好几倍。这个习惯看起来笨但回报很高。最后分享一个小技巧当你卡住的时候把问题反过来描述给 AI。比如“我要实现 X但 Y 总是出错”改成“在什么情况下 Y 会出错怎么避免”。反向描述经常能触发 AI 给出你没想到的思路。这个技巧我在调试选区逻辑时用过效果很好。

相关新闻

Grin 中的 Dandelion++:隐私保护的交易聚合与传播协议详解

Grin 中的 Dandelion++:隐私保护的交易聚合与传播协议详解

区块链Web3 【免费下载链接】grin Minimal implementation of the Mimblewimble protocol. 项目地址: https://gitcode.com/gh_mirrors/gr/grin 点击查看 免费下载 本文依据 Grin 官方 Dandelion 文档 编写,并结合作品源码(servers/src/comm…

2026/10/13 6:46:51 阅读更多 →
COMSOL计算纳米颗粒吸收散射截面的完整指南:从模型搭建到Mie验证

COMSOL计算纳米颗粒吸收散射截面的完整指南:从模型搭建到Mie验证

做纳米光子学模拟的人,十个里有八个的入门案例是单颗纳米颗粒的散射问题。我也不例外,最早用FDTD算金纳米球的消光光谱,后来切到COMSOL,用波动光学模块重新搭了一套吸收散射截面的计算流程,中间踩了不少坑。今天想把这…

2026/10/13 6:46:51 阅读更多 →
Python三维偏微分方程有限差分法求解:从一阶近似推导到代码实现

Python三维偏微分方程有限差分法求解:从一阶近似推导到代码实现

简介:这份资源面向具有数学建模基础与编程经验的研究人员或工程师,聚焦三维立方体域上六个耦合偏微分方程组的数值求解问题。内容以有限差分法为核心,完整覆盖计算域离散、中心差分近似空间导数、迭代求解代数方程组及边界条件处理等关键环节…

2026/10/13 6:46:51 阅读更多 →

最新新闻

链表分解:从内存布局到指针偏移的底层实践

链表分解:从内存布局到指针偏移的底层实践

1. 项目概述:这不是“拆链子”,而是把链表“掰开揉碎”讲清楚 “链表的分解”这五个字,乍看像一道算法题的标题,但实际在一线教学、代码评审和系统调试中,它代表一种极其关键的底层思维训练——不是单纯地写个反转或删…

2026/10/13 7:37:09 阅读更多 →
Python网络协议编辑器与分析器:从抓包到构造的全链路实现

Python网络协议编辑器与分析器:从抓包到构造的全链路实现

简介:计算机网络课程设计作品,包含网络协议编辑器与网络协议分析器,采用Python编程实现,面向计算机专业本科生、网络编程爱好者及需要完成类似课设的开发者。资源内包括两个主要Python脚本:packet_sender.py用于创建、…

2026/10/13 7:37:09 阅读更多 →
Unity触发器实战:翻滚闪避技能与无敌帧实现

Unity触发器实战:翻滚闪避技能与无敌帧实现

最近在做动作类游戏原型时,我发现很多新手在实现“翻滚/闪避”这类技能时,会遇到一个很典型的问题:动画已经播了、位移也加了,但角色在翻滚过程中要么被敌人的攻击触发器误判命中,要么翻滚结束后触发器没有正确恢复状态…

2026/10/13 7:37:09 阅读更多 →
SwiftUI 与 Agent 架构解析:声明式 UI 驱动端侧智能体

SwiftUI 与 Agent 架构解析:声明式 UI 驱动端侧智能体

1. 从标题拆解 SwiftUI-Agent-Skill 到底想解决什么问题第一次看到 “SwiftUI-Agent-Skill” 这个组合词,我的直觉是:它不是一个单纯的 UI 框架教程,也不是一个泛泛的 AI 工具介绍,而是把三个原本分属不同层面的东西强行捏在了一起…

2026/10/13 7:37:09 阅读更多 →
网页正文提取实战:从URL到干净Markdown的命令行工具

网页正文提取实战:从URL到干净Markdown的命令行工具

1. rea 的定位:从网页 URL 到本地 Markdown 的一站式工具前两个月整理个人知识库的时候,我经常干一件事:把网上看到的好文章存到本地。试过浏览器收藏夹,时间一长全是死链;试过截图,检索和引用都不方便&…

2026/10/13 7:37:09 阅读更多 →
SpringBoot+Vue打造装饰工程管理系统:完整实战解析

SpringBoot+Vue打造装饰工程管理系统:完整实战解析

做装饰工程项目管理的系统,很多老牌软件公司都停留在单体架构时代,界面老旧、流程僵硬,项目经理宁可自己拉Excel表格也不愿意用。而新团队上来就搞微服务分布式,对一家中小型装饰公司来说,根本就是杀鸡用牛刀&#xff…

2026/10/13 7:36:08 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →