前端剪切板操作全解析:从Clipboard API到兼容性实战
1. 项目概述从“复制”到“粘贴”的最后一公里在Web开发里“复制到剪切板”这个功能听起来简单得就像按一下CtrlC但真做起来你会发现它远不止一行document.execCommand(copy)那么简单。我见过太多项目在这个看似不起眼的功能上栽了跟头用户点了复制按钮系统也提示“复制成功”结果一粘贴要么格式全乱了要么干脆没内容或者在某些浏览器上直接失灵。这“最后一公里”的问题直接影响了用户体验的顺畅度。这个功能的核心就是解决用户如何将网页上的特定内容一段文本、一个链接、甚至一个复杂的JSON字符串一键存入系统剪切板以便他们能粘贴到任何其他地方。它适合所有前端开发者无论是刚入门的新手还是需要处理复杂交互场景的老手。毕竟让用户手动选中再复制在移动端或者面对长串验证码、邀请码时体验实在太糟糕了。随着现代Web应用交互越来越复杂对剪切板操作的要求也从简单的文本扩展到了富文本、图片甚至文件背后的技术方案和坑点也越来越多。2. 核心方案演进与选型逻辑早期我们基本都靠document.execCommand(copy)这一招打天下。它的原理是你需要先创建一个临时的textarea或input元素把要复制的内容塞进去然后选中这个元素的内容最后执行命令。这个方法兼容性曾经不错但最大的问题是它严重依赖文本选区selection并且是一个同步的、可能失败的操作。为什么现在不推荐它了因为W3C已经明确将其标记为“废弃”deprecated。主流的现代浏览器虽然还支持但保不齐哪个版本就彻底移除了。更重要的是它在一些异步场景比如先发起一个网络请求拿到数据再复制或者用户没有主动交互比如页面加载完自动复制的情况下很可能被浏览器安全策略拦截而静默失败。所以现在的绝对主力是Clipboard API具体是navigator.clipboard.writeText()方法。它的优势非常明显异步操作返回一个Promise你可以清晰地知道复制是成功还是失败方便进行后续的UI反馈比如成功提示或错误提醒。更清晰的权限模型它通常要求在当前页面有用户交互如点击事件的“安全上下文”中触发这比老API的隐式规则更明确。面向未来这是W3C推动的现代标准是浏览器发展的方向。那么是不是所有情况都无脑用Clipboard API呢也不是。你得考虑兼容性。虽然现代浏览器Chrome 66 Firefox 63 Safari 13.1都支持了但如果你需要照顾一些老旧的浏览器环境比如某些国内定制浏览器、低版本WebView可能就需要准备一个降级方案。这就是为什么很多成熟的第三方库如clipboard.js内部会做一个能力检测Feature Detection优先使用Clipboard API失败后再优雅地回退到老式的execCommand方法。注意navigator.clipboard在非安全上下文如HTTP页面或某些限制严格的iframe中可能不可用。在开发调试时务必在HTTPS环境或localhost下测试。3. 基础文本复制的实现与细节我们先从最核心、最常用的纯文本复制开始。一个健壮的实现必须处理好成功、失败以及兼容性。3.1 使用现代 Clipboard API这是当前的首选方法。代码逻辑清晰async function copyTextToClipboard(text) { try { // 关键调用writeText 方法 await navigator.clipboard.writeText(text); console.log(文本已成功复制到剪切板, text); // 这里可以更新UI显示成功状态 return true; } catch (err) { console.error(复制失败, err); // 这里可以更新UI显示失败状态并可能触发降级方案 return false; } } // 在按钮点击事件中调用 document.getElementById(copyBtn).addEventListener(click, async () { const textToCopy document.getElementById(codeSnippet).innerText; const success await copyTextToClipboard(textToCopy); if (success) { showToast(复制成功); } else { showToast(复制失败请手动选择复制。); } });为什么用async/await因为writeText返回Promise。使用async/await可以让错误处理更集中代码流程更直观避免了回调地狱。3.2 兼容性降级方案为了应对不支持Clipboard API的环境我们需要准备一个备选方案。这就是经典的“创建隐藏文本域”法function fallbackCopyTextToClipboard(text) { // 1. 创建临时textarea元素 const textArea document.createElement(textarea); textArea.value text; // 2. 将其移出视口外避免影响布局但不要用display: none否则某些安卓设备无法选中 textArea.style.position fixed; textArea.style.top 0; textArea.style.left -9999px; // 3. 添加到DOM中 document.body.appendChild(textArea); // 4. 选中内容 textArea.focus(); textArea.select(); // 对于移动设备select()可能不生效需要更复杂的处理 // 5. 执行复制命令 let succeeded; try { succeeded document.execCommand(copy); console.log(降级复制命令 (succeeded ? 成功 : 失败)); } catch (err) { console.error(降级复制出错, err); succeeded false; } // 6. 清理DOM移除临时元素 document.body.removeChild(textArea); // 7. 根据结果处理焦点可选但推荐 if (succeeded document.activeElement) { document.activeElement.blur(); } return succeeded; }几个关键细节解析为什么不用display: none在一些旧版本的Android WebView中对display: none的元素执行select()可能会失败。使用绝对定位移出屏幕是更可靠的做法。select()的局限性在移动端特别是iOS上对于非input/textarea的元素select()方法可能无法工作。这就是为什么我们必须创建一个textarea。清理工作复制完成后务必移除临时元素避免污染DOM树引发内存泄漏。焦点处理复制后让原活动元素失焦是一个好习惯可以避免一些奇怪的键盘弹出或UI状态残留问题。3.3 整合的健壮复制函数将两者结合形成一个通用的复制函数function copyText(text) { // 能力检测优先使用现代API if (navigator.clipboard window.isSecureContext) { // 注意在非安全上下文非HTTPS且非localhostclipboard对象可能为undefined return navigator.clipboard.writeText(text).then( () true, () fallbackCopyTextToClipboard(text) // 现代API失败降级 ); } else { // 不支持现代API直接使用降级方案 return Promise.resolve(fallbackCopyTextToClipboard(text)); } } // 使用示例 copyText(你好世界).then(succeeded { alert(succeeded ? 复制成功 : 复制失败请手动复制。); });这个函数提供了统一的Promise接口调用者无需关心底层用了哪种方案。4. 处理复杂内容与格式问题用户反馈“复制过去格式不一样”这绝对是高频痛点。问题根源在于你复制时的“源”是什么是纯文本.innerText还是包含HTML标签的富文本.innerHTML4.1 纯文本 vs 富文本复制假设你有一个带样式的divdiv idrichContent b加粗标题/b br span stylecolor: red;红色文字/span /div复制纯文本document.getElementById(richContent).innerText得到的是“加粗标题 红色文字”。粘贴到记事本或终端没问题。复制富文本HTMLdocument.getElementById(richContent).innerHTML得到的是b加粗标题/bbrspan stylecolor: red;红色文字/span。如果你把它当成纯文本复制粘贴到富文本编辑器如Word、邮件客户端它可能不会被解析为格式而是直接显示为HTML标签字符串。解决方案取决于你的目标如果希望粘贴到任何地方都保持无格式始终使用.innerText或.textContent获取纯文本内容。对于复杂的DOM节点可能需要递归提取文本。如果希望粘贴到富文本编辑器能保留基本格式你需要使用Clipboard API更强大的write方法写入text/html格式的数据。这属于“富文本复制”的范畴下文会详述。处理Markdown等特定格式比如从渲染后的Markdown页面复制代码块。你通常需要构造一个包含反引号和语言标识的纯文本字符串而不是复制渲染后的HTML结构。例如复制javascript\nconsole.log(hello)\n而不是一个带高亮样式的pre块。4.2 实现富文本HTML复制现代Clipboard API的navigator.clipboard.write()方法可以写入多种格式的数据。async function copyHtmlToClipboard(htmlText, plainText) { // 创建一个ClipboardItem对象它可以包含多种MIME类型的数据 const clipboardItem new ClipboardItem({ // 提供纯文本版本作为降级或通用支持 text/plain: new Blob([plainText], { type: text/plain }), // 提供HTML版本富文本编辑器会优先使用这个 text/html: new Blob([htmlText], { type: text/html }) }); try { await navigator.clipboard.write([clipboardItem]); console.log(富文本已复制); return true; } catch (err) { console.error(复制富文本失败, err); // 可以尝试降级为只复制纯文本 return copyText(plainText); } } // 使用示例复制一个带链接和样式的文本 const htmlContent 欢迎访问a href\https://example.com\我们的网站/a获取strong更多信息/strong。; const plainContent 欢迎访问我们的网站 (https://example.com)获取更多信息。; copyHtmlToClipboard(htmlContent, plainContent).then(success { // 反馈... });关键点同时提供text/plain和text/html这是最佳实践。富文本编辑器如Gmail、Notion会读取text/html来保留格式而记事本、终端等纯文本环境则会使用text/plain。这直接解决了“复制过去格式不一样”或“复制出代码标签”的问题。Blob对象用于将字符串转换为浏览器剪切板能理解的二进制数据块。兼容性ClipboardItem和write()方法的兼容性比writeText()稍差使用前需要做更细致的检测。4.3 处理输入框如el-input与剪切板事件在Vue/Element UI等框架中你可能会直接操作el-input组件。有时你需要复制其绑定值有时需要监听粘贴事件进行处理。复制输入框的值// 假设使用ref获取组件实例 const inputRef ref(null); const copyInputValue () { const textToCopy inputRef.value?.value || inputRef.value?.$el.querySelector(input).value; copyText(textToCopy); };监听粘贴事件并过滤内容用户提到的“el-input 剪切板 字符包含”可能指的是在粘贴时校验或过滤内容。// 在el-input上监听paste事件 el-input pastehandlePaste / // 处理方法 function handlePaste(event) { // 阻止默认粘贴行为以便我们自定义处理 event.preventDefault(); // 从剪切板获取纯文本数据现代API if (navigator.clipboard navigator.clipboard.readText) { navigator.clipboard.readText().then(text { // 进行过滤例如移除所有空格 const filteredText text.replace(/\s/g, ); // 将处理后的文本插入到输入框 // 注意直接设置input的value可能不会触发Vue的数据绑定需使用对应方法 // 这里假设通过事件对象插入 const target event.target; const start target.selectionStart; const end target.selectionEnd; const newValue target.value.substring(0, start) filteredText target.value.substring(end); // 如果是Vue组件可能需要触发一个input事件来同步数据 target.value newValue; target.dispatchEvent(new Event(input, { bubbles: true })); }); } else { // 降级方案从event.clipboardData获取仅同步在paste事件中有效 const clipboardData event.clipboardData || window.clipboardData; if (clipboardData) { let text clipboardData.getData(text); const filteredText text.replace(/\s/g, ); // ... 同上插入过滤后的文本 } } }重要提示navigator.clipboard.readText()或read()方法需要用户明确授权通常浏览器会弹出权限询问框。它只能在安全的上下文和用户触发的事件如点击中调用。这是出于安全考虑防止网页随意读取用户的剪切板。5. 移动端与特殊场景的深度适配移动端浏览器特别是iOS Safari和安卓WebView的环境更加复杂是问题高发区。5.1 移动端复制触发的安全限制在移动端浏览器对剪切板的访问控制更严格。一个核心原则是复制操作必须由真实的用户手势如click、touchstart同步触发。常见坑点异步调用失败在setTimeout、Promise.then或fetch回调中直接调用复制API很可能被浏览器静默阻止。解决方案在用户手势事件中同步地将需要复制的文本准备好例如存储到一个全局变量或事件对象的属性中然后在后续的异步回调中如请求成功再去读取这个预先准备好的文本执行复制。虽然复制动作本身是异步的但“决策”和“数据准备”是同步发生的这有时能绕过限制。let textPreparedForCopy ; // 用于暂存待复制文本 copyButton.addEventListener(click, (event) { // 同步阶段准备数据 textPreparedForCopy generateDynamicCode(); // 假设这是个同步函数 // 如果是异步获取数据需要在这里发起请求但复制调用仍需在微任务或用户手势延续中尽快执行 fetchSomeData().then(data { textPreparedForCopy data.code; // 尝试立即复制此时仍在用户点击事件产生的任务链中成功率较高 setTimeout(() { // 甚至用一个极短的setTimeout包裹 copyText(textPreparedForCopy); }, 0); }); });5.2 处理移动端输入框选中问题在移动端通过textarea.select()选中内容的行为可能不奏效尤其是对于动态创建的元素。一个更可靠的方法是使用setSelectionRange。function selectText(textarea) { // 对于input/textareasetSelectionRange是更可靠的方法 textarea.focus(); textarea.setSelectionRange(0, textarea.value.length); // 选中全部文本 } // 在降级方案中替换 textArea.select() 行 // textArea.select(); // 可能失效 selectText(textArea); // 使用这个5.3 处理第三方应用和特殊内容用户提到的“复制本段消息打开XX浏览器”这类口令或者“李跳跳规则一键复制”这类场景核心是复制一段具有特定格式或指令的文本。实现上没有特殊之处关键是确保复制的文本完全正确没有多余的空格、换行或不可见字符。对于复制JSON、配置代码等建议序列化使用JSON.stringify(data, null, 2)美化输出方便用户阅读和编辑。转义如果文本中包含可能被误解的字符确保正确处理。提供多种格式例如同时提供“压缩版”单行无空格和“美化版”供用户选择复制。6. 用户体验优化与高级技巧功能实现了下一步是让它用起来舒服、可靠。6.1 提供明确的视觉反馈用户点击后必须立即知道发生了什么。成功按钮文字短暂变为“已复制”并可以伴随一个对勾图标或轻微的动画。失败按钮可以抖动、变红或显示“复制失败请长按选择复制”的提示。async function copyWithFeedback(text, buttonElement) { const originalText buttonElement.textContent; try { await copyText(text); // 成功反馈 buttonElement.textContent ✓ 已复制; buttonElement.style.backgroundColor #4CAF50; // 绿色 setTimeout(() { buttonElement.textContent originalText; buttonElement.style.backgroundColor ; }, 2000); // 2秒后恢复 } catch (err) { // 失败反馈 buttonElement.textContent 复制失败; buttonElement.style.backgroundColor #f44336; // 红色 setTimeout(() { buttonElement.textContent originalText; buttonElement.style.backgroundColor ; }, 2000); } }6.2 复制富内容与图片高级通过Clipboard API我们甚至可以复制图片。原理是将图片转换为Blob例如通过Canvas或fetch获取图片然后以image/png格式写入剪切板。async function copyImageToClipboard(imageUrl) { // 1. 通过网络获取图片数据 const response await fetch(imageUrl); const imageBlob await response.blob(); // 2. 创建ClipboardItem const clipboardItem new ClipboardItem({ image/png: imageBlob // 假设我们知道它是PNG格式 }); // 3. 写入剪切板 await navigator.clipboard.write([clipboardItem]); console.log(图片已复制到剪切板); }注意复制图片的浏览器支持度非常有限截至现在主要Chrome桌面版支持较好且对图片源有严格的CORS要求。生产环境需谨慎使用并做好兼容性处理。6.3 使用优秀的第三方库如果你不想处理这么多兼容性和细节使用一个成熟的库是最高效的选择。clipboard.js是目前最流行、最稳定的选择。安装npm install clipboard --save # 或 yarn add clipboard使用!-- 通过>问题现象可能原因排查步骤与解决方案点击复制提示成功但粘贴无内容1. 复制的文本是undefined或空字符串。2. 降级方案中临时textarea未正确添加到DOM或被快速移除。3. 移动端异步调用被阻止。1.console.log确认要复制的文本值。2. 在降级方案中确保document.body.appendChild(textArea)后execCommand执行前元素已在DOM中。可以添加一个极短的setTimeout确保渲染。3. 确保复制调用紧跟在用户手势事件链中避免深层异步。在HTTPS下复制功能正常HTTP下失效navigator.clipboard在非安全上下文被禁用。1. 检查window.isSecureContext。2. 强制使用降级方案if (!window.isSecureContext) { // 只用fallback }。3. 推动站点升级到HTTPS。iOS Safari中复制失败1. 安全策略限制。2.select()方法对动态创建的元素无效。1. 确保复制操作由用户点击按钮触发且是同步或微任务Promise.then,setTimeout(fn, 0)中执行。2. 使用setSelectionRange替代select()。复制富文本到微信/钉钉等应用格式丢失这些应用可能只接受text/plain格式或对HTML过滤严格。1. 确保ClipboardItem同时提供了优质的text/plain版本。2. 对于这些特定环境考虑只提供纯文本复制按钮。execCommand(‘copy’)返回false1. 没有选中的文本。2. 调用时机不对如非用户交互。3. 元素不可见或不可选。1. 在execCommand前调用textArea.select()并确认选中成功可检查document.getSelection()。2. 必须在用户事件如click回调中同步调用。3. 确保临时文本域在视口中即使定位到top:0;left:-9999px。7.2 实操心得与技巧永远提供降级方案和手动选择备选在你的“复制”按钮旁边可以放一个“点击显示请手动选择复制”的备用区域。当自动复制失败时显示这个区域让用户手动选择文本后复制。这是最可靠的兜底策略。文本预处理复制前清理文本中的多余空白符trim()、归一化换行符将\r\n统一为\n。对于代码注意转义HTML实体如lt;。谨慎使用document.execCommand尽管是降级方案但在某些浏览器扩展或安全软件干扰下它也可能被禁用。做好完全失败的UI提示。测试测试再测试必须在真机iOS Safari 各种Android浏览器和WebView上测试。桌面浏览器和移动浏览器的行为差异巨大。权限请求的友好引导如果你的应用需要读取剪切板如粘贴验证码在调用navigator.clipboard.readText()时浏览器会弹窗请求权限。最好在触发此操作前用文字提示用户“接下来需要访问您的剪切板以粘贴验证码”提升通过率。处理大文本复制非常大的文本内容比如几十万字符时性能可能成为问题。创建和操作大的textarea或Blob会消耗内存。可以考虑分块处理或者提示用户“内容过大建议手动选择”。复制功能虽小却贯穿了Web标准演进、浏览器兼容性、安全策略和用户体验设计多个方面。从简单的execCommand到现代的Clipboard API从处理纯文本到富文本甚至图片每一次需求深化都要求我们对底层原理有更清晰的认识。最关键的体会是永远不要假设用户的浏览器和环境是理想的健壮的程序来自于对边界情况的充分理解和处理。在实际项目中我通常会先采用clipboard.js这类库快速实现当遇到库无法解决的特定场景问题时再根据上面的原理进行定制化改造这样能在效率和可控性之间取得最好的平衡。

相关新闻

大模型算力基石:从CUDA Tile并行原理到GEMM内核优化实践

大模型算力基石:从CUDA Tile并行原理到GEMM内核优化实践

这次我们来看一个底层技术问题:为什么几乎所有大模型的算力都压在 GEMM(通用矩阵乘法)上?这背后是 GPU 架构、CUDA 编程和并行计算原理的深度耦合。理解这一点,不仅能解释为什么 Transformer 模型如此依赖 GPU&#xf…

2026/10/20 15:44:21 阅读更多 →
从提示词工程到驾驭工程:构建可靠AI系统的四大支柱

从提示词工程到驾驭工程:构建可靠AI系统的四大支柱

1. 从“喂”到“驯”:AI工程范式的悄然革命 最近在AI圈子里,一个词的热度正在悄然攀升,甚至开始挑战我们刚刚熟悉起来的“Context Engineering”(上下文工程)的地位,那就是“Harness Engineering”。如果你…

2026/10/19 19:01:38 阅读更多 →
基于FastAPI与Redis构建高性能微信后端:从异步架构到丝滑体验

基于FastAPI与Redis构建高性能微信后端:从异步架构到丝滑体验

1. 项目缘起:一个“离谱”的跨界尝试 最近在折腾一个挺有意思的项目,起因是我身边一位做奢侈品电商的朋友。他跟我吐槽,说他们后台的客服系统,尤其是微信端的接入,总是卡顿、延迟,客户体验一言难尽。他半开…

2026/10/15 14:33:29 阅读更多 →

最新新闻

Skills不是标签:构建可验证的能力坐标系

Skills不是标签:构建可验证的能力坐标系

1. “skills”不是标签,是能力坐标系的动态刻度最近在几个技术社区和职业发展类平台反复看到一个现象:大量简历、项目介绍、自我介绍里高频出现“skills”这个词,但点开一看,要么是堆砌一长串技术名词,要么是“精通Pyt…

2026/10/21 4:13:41 阅读更多 →
Windows Terminal完全指南:从安装配置到高效命令行工作台

Windows Terminal完全指南:从安装配置到高效命令行工作台

如果你还在用Win10自带的cmd窗口写命令,我强烈建议你腾一下午时间,把Windows Terminal折腾明白。真不是小题大做——我第一次把工作环境从原生的PowerShell窗口切过来之后,最大的感受是:为什么没有早几年用上它。命令行这种每天要…

2026/10/21 4:13:41 阅读更多 →
IndexedDB游标实战:解决大数据量遍历性能瓶颈

IndexedDB游标实战:解决大数据量遍历性能瓶颈

1. 游标到底解决了什么问题1.1 先看一个典型的本地数据“膨胀”场景我用 IndexedDB 最早是在一个纯前端的离线表格应用里,当时数据量大概只有几千条记录,直接getAll()一把梭,页面是秒开。后来客户开始往里面导 Excel,单表轻松破三…

2026/10/21 4:13:41 阅读更多 →
基于 AAS 技能库掌握 Azure AI Projects Java SDK:Azure AI Foundry 项目级资源管理实战指南

基于 AAS 技能库掌握 Azure AI Projects Java SDK:Azure AI Foundry 项目级资源管理实战指南

基于 AAS 技能库掌握 Azure AI Projects Java SDK:Azure AI Foundry 项目级资源管理实战指南 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validatio…

2026/10/21 4:13:41 阅读更多 →
UniHacker 使用教程:三平台解锁 Unity 编辑器与 UnityHub 的操作手册

UniHacker 使用教程:三平台解锁 Unity 编辑器与 UnityHub 的操作手册

UniHacker 使用教程:三平台解锁 Unity 编辑器与 UnityHub 的操作手册 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker UniHacker 是一款基于 Aval…

2026/10/21 4:13:41 阅读更多 →
芯片烧录上位机实操指南:错误代码分类排查与产线稳定避坑

芯片烧录上位机实操指南:错误代码分类排查与产线稳定避坑

Flashrunner这种上位机,操作界面上看起来就是几个窗口、几个按钮,但真正在产线或者实验室里跑起来,你会发现它背后牵扯的东西远比想象中多。芯片型号匹配、通信稳定性、目标文件格式、供电质量,甚至是一根USB线的好坏,…

2026/10/21 4:12:41 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →