用JavaScript实现图片翻转:Canvas坐标系与像素级处理实战
简介一套用JavaScript实现图片翻转效果的入门示例资源面向Web前端初学者与对图片交互感兴趣的开发者。资源演示了通过操作CSS transform属性、绑定点击事件监听器以及管理翻转状态实现图片沿X轴或Y轴180度动态翻转的方法可加深对JavaScript DOM操作与事件机制的理解。压缩包共36个文件以26张GIF动图、7张JPG图片为主包含2个HTML页面script01.html、script02.html和1个核心JS脚本script02.js附带多种素材与按钮状态图整体仅413KB轻量易用。已有136人学习下载。通过这份示例可学习事件监听、transform样式切换与CSS过渡动画的协同写法并借鉴项目中多个HTML结构不同实现风格快速搭建自己的翻转交互效果。1. 用javascript写的图片翻转先别急着加CSS滤镜翻转背后是一套坐标系在管做图片上传、头像裁剪、证件照处理的前端迟早会遇到用javascript写的图片翻转这个需求——比如用户自拍时镜像方向不对或者要生成一张水平翻转的缩略图。很多人第一反应是加一行transform: scaleX(-1)界面秒变但导出图片时才发现Canvas画出来还是原样或者转成base64后方向根本没变。原因很简单CSS transform只改变了元素的绘制表现像素数据还躺在原图里没动。真正用javascript写的图片翻转常见做法是用Canvas读入图片、通过坐标系映射重新绘制再把结果导出为新图片。它适合的不只是预览还包括批量生成翻转后的文件、给OCR或人脸检测模型喂预处理图像、把翻转和裁剪压缩组合成一条流水线。这篇按我实际调过的路子走先讲清翻转的底层逻辑再给最小可运行代码参数和坑放在后面最后落成一个能用的JavaScript函数。2. 图片翻转的两种实现CSS transform与Canvas像素复制的差别2.1 CSS transform看一眼就翻转但拿不到像素真相业务里最常见的快速翻转是transform: scaleX(-1)。它不改变文档流也不会触发重绘GPU合成器直接把元素沿着垂直轴镜像效果是即时且平滑的。但它的边界很清楚只作用于屏幕上的渲染结果。如果你用canvas.drawImage()把这个被翻转的元素画进去或者用html2canvas截图要么拿到原方向要么因为跨域和缓存问题翻车。所以在我经手的项目里CSS transform只用来做预览态等用户确认翻转后再用Canvas真正生成一张新图片。如果你的需求就是屏幕上左右对称看一下CSS的scaleX(-1)够用一旦涉及导出、上传、像素级处理必须走向Canvas。2.2 Canvas的scale(-1,1)翻转背后的坐标系操作Canvas里翻转的核心不是倒像素而是变换坐标系。ctx.scale(-1, 1)的效果是把x轴反向原来x100的点会变成x-100所有内容沿着y轴镜像。但这里有个新手绕不过的坑——坐标系反转后图片会被画到负x区域也就是说你很可能在Canvas上什么都看不到。常见的做法是先用ctx.translate(width, 0)把原点移到画布右边缘再执行scale(-1, 1)这样图片才会落在可见区域内。垂直翻转同理用ctx.translate(0, height)加ctx.scale(1, -1)。我一般建议把这两步封装成一对操作顺序不能反先平移再缩放否则你平移的坐标也被镜像了结果完全错位。下面这段代码展示水平翻转的核心动作// 假设 canvas 和 ctx 已创建img 已加载 ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.save(); ctx.translate(canvas.width, 0); // 先把原点移到右边界 ctx.scale(-1, 1); // x轴反向画面被拉回可见区 ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 绘制原图 ctx.restore();逻辑说明translate(canvas.width, 0)是把坐标原点从左上角挪到右上角。此时x轴正方向朝左再配合scale(-1, 1)原本朝右的绘制方向变成朝左于是画出来的图像正好是水平镜像而且完整落在画布内。ctx.save()和ctx.restore()保证这次变换不影响后续绘制。这里的canvas和img的真实尺寸要一致否则drawImage的五参形式会做拉伸而不是翻转。2.3 getImageData与像素矩阵翻转的本质是坐标映射如果你以为翻转只能靠scale那还可以更底层一点。Canvas的ctx.getImageData(0, 0, width, height)会返回一个Uint8ClampedArray每四个元素组成一个RGBA像素。水平翻转的本质是构造一个新数组把原图中(x, y)处的像素放到目标数组的(width - 1 - x, y)位置。这种做法的好处是可以在翻转的同时做像素级的调整比如同时修掉透明通道的杂色或者和镜像滤镜、灰度化混在一起。代价是慢——1000万像素的图片getImageData和逐像素循环在纯JavaScript里跑一遍可能要一两百毫秒移动端逼近半秒。我通常只在小区域裁剪或做特效时用像素矩阵普通翻转优先走scale加drawImage的GPU路径。这里有一个JavaScript判断数据类型的细节容易踩坑getImageData返回的不是普通数组而是Uint8ClampedArray。用Array.isArray()判断会返回false很多人在这里翻车。我一般用Object.prototype.toString.call(pixel.data)来确认类型或者干脆不做判断要知道它就是整数数组下标从0开始每四位一组。处理像素时data[i]、data[i1]、data[i2]、data[i3]分别对应红、绿、蓝、透明通道顺序别记反。3. 用Canvas实现图片翻转从加载到导出的最小可运行代码3.1 在本地用FileReader和Image对象加载图片跑通翻转的第一步是把用户选择的图片读成Image对象。常见做法是用FileReader把文件读成DataURL再赋给Image.src。这里有一个JavaScript运行时报错的高发点FileReader的onload事件里e.target.result是字符串你不能再对它调用FileReader相关方法。下面是一个能直接用的小加载器function loadImageFromFile(file) { return new Promise((resolve, reject) { const reader new FileReader(); reader.onload (e) { const img new Image(); img.onload () resolve(img); img.onerror () reject(new Error(图片解码失败)); img.src e.target.result; // 这里 result 是 base64 字符串 }; reader.onerror () reject(new Error(文件读取失败)); reader.readAsDataURL(file); }); }参数说明FileReader.readAsDataURL会把图片读成data:image/png;base64,...样式的字符串适合小图一般5MB以内。new Image()创建的是HTMLImageElement实例它加载base64是异步的所以要用Promise把图像准备状态暴露给调用方。如果你的图片源是远程URL需要先配置跨域否则后面导出时会遇到Canvas被污染的问题第5节会细讲。3.2 用ctx.translate和ctx.scale完成水平/垂直翻转拿到Image对象后就可以创建Canvas并执行翻转了。水平翻转是刚那两行核心代码垂直翻转我写成参数化的函数顺手解决旋转角度不居中的问题function flipImage(img, direction horizontal) { const canvas document.createElement(canvas); const ctx canvas.getContext(2d); canvas.width img.naturalWidth; canvas.height img.naturalHeight; ctx.save(); if (direction horizontal) { ctx.translate(canvas.width, 0); ctx.scale(-1, 1); } else if (direction vertical) { ctx.translate(0, canvas.height); ctx.scale(1, -1); } ctx.drawImage(img, 0, 0, canvas.width, canvas.height); ctx.restore(); return canvas; }这段代码的逻辑说明canvas.width和canvas.height直接取原图自然尺寸保证不拉伸。水平翻转的transform顺序是先平移后缩放垂直方向同理是translate(0, height)。drawImage绘制时因为坐标系已经变换所以图片内容会被镜像绘制到画布上。save/restore是必须的否则下一次绘制会叠加之前的变换。注意这里没有处理EXIF方向如果拍照图片自带orientation信息你会看到翻转结果不符合直觉这个在避坑章里处理。3.3 导出翻转结果canvas.toDataURL与toBlob的选型翻转完成后需要把Canvas变成可上传的文件数据。两个选择canvas.toDataURL(mimeType, quality)返回base64字符串适合直接塞进表单或存localStoragecanvas.toBlob(callback, mimeType, quality)返回Blob对象适合FormData上传体积也比base64小约33%。我的习惯是预览用toDataURL(image/jpeg, 0.92)上传用toBlob包装成File。下面代码演示如何把Canvas变成Blobfunction canvasToBlob(canvas, mimeType image/png, quality 0.92) { return new Promise((resolve, reject) { canvas.toBlob((blob) { if (blob) { resolve(blob); } else { reject(new Error(Canvas导出失败可能画布被污染)); } }, mimeType, quality); }); }值得强调的是toBlob的回调风格它不走Promise必须手动包一层。质量参数quality只对JPEG和WebP有意义PNG传了也会被忽略。如果你要在上传前把Blob转成File以便添加文件名可以new File([blob], fileName, { type: mimeType })。这段代码里没有做Canvas尺寸上限处理超大图导出时内存占用会飙升建议在创建Canvas前先做压缩具体参数下一章说明。4. 翻转相关的三个必调参数图片尺寸、插值质量与输出格式4.1 width/height怎么定设备像素比与CSS像素的换算很多人在翻转后把Canvas直接塞进页面显示结果图片发虚。这是因为Canvas的位图尺寸和CSS显示尺寸不是一回事。Canvas的width/height是像素网格数量样式表里的width/height是CSS像素高DPI屏幕上1个CSS像素可能对应2个物理像素。如果你只设样式尺寸Canvas的实际像素默认只有300x150或原大小在Retina屏上会被拉伸。我一般遵循Canvas像素尺寸 原图尺寸 × 设备像素比如果只是预览或者直接设为原图的naturalWidth/naturalHeight如果要导出原图大小。下面是计算预览画布尺寸的常用写法const dpr window.devicePixelRatio || 1; const displayWidth Math.round(img.naturalWidth * dpr); const displayHeight Math.round(img.naturalHeight * dpr); canvas.width displayWidth; canvas.height displayHeight; canvas.style.width (img.naturalWidth) px; canvas.style.height (img.naturalHeight) px;这段参数说明canvas.width决定实际像素数canvas.style.width决定CSS显示大小。翻转后导出时我建议用原图尺寸而不是dpr放大因为放大会导致位图插值JPEG重新编码后文件体积变大画质却不一定提升。导出场景下dpr只影响屏幕显示不影响文件像素。如果你是把翻转后的图片用于OCR保持原分辨率通常命中率更高。4.2 插值质量参数imageSmoothingEnabled与imageSmoothingQuality翻转本质是重绘如果原图尺寸和目标尺寸不一致Canvas会做插值。ctx.imageSmoothingEnabled默认是true意味着缩放时做平滑ctx.imageSmoothingQuality可以设置low、medium、high三个档位。很多人忽略这个参数导致翻转缩放出锯齿或糊成一团。我调证件照的经验是缩小图片用high放大图片也用high如果做像素风或需要硬边就关掉平滑。下面是一段上下文const ctx canvas.getContext(2d); ctx.imageSmoothingEnabled true; ctx.imageSmoothingQuality high; ctx.drawImage(img, 0, 0, targetWidth, targetHeight);注意imageSmoothingQuality是较新的Canvas属性老版本WebView里可能不支持但设置不支持的属性不会报错只会被忽略。如果你发现翻转后的文字边缘发虚优先检查是不是目标尺寸小于原图却在用medium。另外drawImage在翻转时也会触发插值所以翻转这种等尺寸操作其实不需要插值——如果你画布尺寸和原图完全一致插值不影响结果。只有当你同时做翻转和缩放时这套参数才真正起作用。4.3 输出格式与压缩质量PNG、JPEG、WebP怎么选翻转完成后导出的格式直接影响文件体积和适用范围。我的选择逻辑很简单需要透明背景或边缘锐利截图、贴纸、验证码选PNG照片或头像选JPEG质量0.8~0.92支持WebP的环境选WebP体积最小。下面是一个综合导出示例function exportFlipedImage(canvas, format image/jpeg, quality 0.85) { if (format image/jpeg) { // JPEG不支持透明先把透明底填成白色否则导出后透明区域变黑 const exportCanvas document.createElement(canvas); const exportCtx exportCanvas.getContext(2d); exportCanvas.width canvas.width; exportCanvas.height canvas.height; exportCtx.fillStyle #ffffff; exportCtx.fillRect(0, 0, exportCanvas.width, exportCanvas.height); exportCtx.drawImage(canvas, 0, 0); return exportCanvas.toDataURL(image/jpeg, quality); } return canvas.toDataURL(format image/webp ? image/webp : image/png); }这块有一个血泪经验JPEG编码时透明像素会被当作黑色透明背景的头像导出后角落全变黑。所以必须先填充白色底。质量参数0.85通常是人像可接受的最小值低于0.7会出现明显的色块条纹。WebP在Chrome和Edge上支持很好但导出时要检测浏览器是否真正支持canvas.toDataURL(image/webp)不支持时会返回image/png数据可能造成体积膨胀。检测可以用canvas.toDataURL(image/webp).startsWith(data:image/webp)。5. 图片翻转避坑运行时报错、黑边和性能崩溃的五个真实记录5.1 跨域图片导致Canvas被污染toDataURL运行时报错现象用远程URL加载图片翻转后调用canvas.toDataURL()浏览器抛出SecurityErrorPage里console报“Failed to execute toDataURL on HTMLCanvasElement: Tainted canvases may not be exported”。原因Canvas的“污染”机制——只要绘制了跨域图片且图片服务器没返回正确的CORS头Canvas格式就会被标记为不干净禁止任何形式的导出。解决在设置img.src之前先设置img.crossOrigin anonymous同时要求图片服务器响应头带Access-Control-Allow-Origin。如果你控制不了服务器只能把图片打成base64再加载或者要求后端做代理。这是我踩过最深的坑——本地开发没问题部署到CDN后就炸排查半天发现是CDN没配头。5.2 翻转后出现黑边或透明边缘坐标系平移没做对现象翻转后的图片一侧多了一条黑边或透明条另一侧被裁掉一点。原因最常见的是只调用了scale(-1, 1)而没有translate(width, 0)。翻转后图像落到负坐标区域Canvas只绘制可见区于是左边界出现空白或者你translate(width, 0)但width用的是CSS尺寸而不是Canvas的像素宽度导致偏移量差了几个像素。解决严格用canvas.width作为translate参数不是canvas.clientWidth也不是img.style.width。同时检查drawImage的绘制矩形是否和画布完全对齐ctx.drawImage(img, 0, 0, canvas.width, canvas.height)。如果设置了dpr倍数的尺寸注意translate要用实际像素值。这类问题肉眼可能看不出来导出后放到Photoshop里放大比对边缘才明显。5.3 大图翻转卡死不要直接getImageData处理超大原图现象用手机拍的高清照片4000x3000左右做翻转页面卡顿2秒以上内存占用暴增低端安卓甚至直接白屏崩溃。原因getImageData创建了一个和画布同等大小的RGBA数组4000x3000x4约48MB再加上原图解码的Bitmap和Canvas的离屏缓冲区移动端内存直接爆。更别说Pixel级的for循环还要再分配一个相等大小的数组用来存放翻转结果。解决常规翻转直接用ctx.scale加drawImage走GPU合成不会产生大内存数组。只有真正需要逐像素处理时才用getImageData而且先缩小画布。我的做法是每次操作前先限制最大边超过2048像素时等比缩小到2048以内再处理。这样既能保住绝大多数场景的显示需求又不会卡死。5.4 JavaScript判断数据类型翻车e.target.result是字符串不是图片现象在FileReader.onload里拿到e.target.result直接把它当成Image对象去设置canvas.width结果得到undefinedCanvas被清空成0x0。原因FileReader返回的是DataURL字符串而Image实例需要src属性赋予后、触发onload事件才能使用。很多人误以为读取完就拿到图片二进制了。解决用Promise包装在img.onload回调里resolve真正的HTMLImageElement。另外一定要判断img.complete img.naturalWidth 0否则可能拿到一个空图。这种问题JavaScript运行时报错不会提示只会在后续绘制时莫名其妙地什么都不显示。5.5 保留两位小数的错觉旋转角度计算中浮点误差累积现象做翻转和旋转组合操作时Math.tan和Math.atan反复计算后图片边缘出现亚像素缝隙或者导出尺寸少了1个像素。原因浮点数表达精度是有限的0.1 0.2 ! 0.3这种经典问题在矩阵变换中会累积成像素偏移。很多人只关心JavaScript保留两位小数却忘了变换矩阵里的坐标精度会影响到绘图结果。解决在坐标计算处用Math.round()把最终像素坐标取整或者用Number.toFixed(2)再转为Number。比例计算时尽量避免连续乘除。如果做旋转加翻转我一般用Math.hypot(width, height)算对角线长度来推导目标Canvas尺寸可以减少一次中间误差。翻转本质是坐标取反理论上没有精度问题但组合操作会引入。建议每次变换完成后立即导出不要反复在同一个Canvas上叠加操作。6. 把翻转封装成JavaScript函数参数校验、边界处理与验证技巧最后把前面跑的流程收拢成一个可复用的函数顺便说两个我常用的验证习惯。这个函数同时支持水平和垂直翻转自动处理EXIF方向、跨域和导出格式问题。参数上我会接受一个options对象包含direction、outputFormat、quality和maxSize。校验顺序是先检查图片是否加载完成再判断Canvas能否导出最后检查输出格式支持度。maxSize默认2048超过则等比缩放到最大边这是防内存崩溃的底线。验证技巧有两个第一翻转后用ctx.getImageData在像素级抽查比如原图左上角像素是红色水平翻转后右下角像素应该变成红色。写一个assertPixelColor的小工具能自动跑回归测试。第二对照真实物理镜像判断黑边和方向我会准备一张写了数字的纯色图片水平翻转后数字应呈镜像且背景无黑边。这个习惯帮我抓到了不止一次translate参数用错的翻车现场。如果你要批量验证假设调用flipImage(source, { direction:horizontal, maxSize:1024 })返回Canvas再把它绘制到一个隐藏测试画布上检查像素分布就行。第一人称教训早期我只写CSS transform觉得Canvas是小题大做直到全量导出发现全是原图才回头补课。现在碰到图片翻转我会先问一句是不是需要拿到像素数据需要就用Canvas不需要才用CSS。这不是什么玄学而是把预览和产出分开管理。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

MFC扫雷游戏开发实战:从消息映射到算法实现的完整指南

MFC扫雷游戏开发实战:从消息映射到算法实现的完整指南

简介:基于MFC开发的扫雷游戏完整工程,属于可直接运行与二次学习的完整源码包,适合Windows C初学者和希望深入理解MFC界面编程的开发者。项目复刻了经典扫雷的雷区随机生成、左右键标记、计时与胜负判断等核心玩法,源码中包含自定义…

2026/10/11 0:11:34 阅读更多 →
MFC扫雷源码详解:消息映射、GDI双缓冲与经典算法实战

MFC扫雷源码详解:消息映射、GDI双缓冲与经典算法实战

简介:一份基于MFC开发的扫雷游戏完整源码包,面向C初学者与Windows界面编程爱好者,旨在展示如何使用MFC框架构建经典小游戏的完整流程。包内共71个文件,涵盖bmp位图资源(用于雷区、笑脸等图标)、cpp/h源码&a…

2026/10/11 0:11:34 阅读更多 →
InST Windows10可执行版:轻量级OCR本地推理引擎实战指南

InST Windows10可执行版:轻量级OCR本地推理引擎实战指南

简介:本资源是基于扩散模型的风格迁移项目InST(Inversion-Based Style Transfer)的Windows 10原生可执行版本,面向深度学习初学者与计算机视觉实践者,提供无需配置CUDA环境、免编译即可运行的端到端风格迁移体验&#…

2026/10/11 0:10:34 阅读更多 →

最新新闻

基于 Raft 协议的强一致分布式锁选型:Etcd vs Redis 在金融级场景下的对比

基于 Raft 协议的强一致分布式锁选型:Etcd vs Redis 在金融级场景下的对比

在分布式锁的选型会议上,架构师们经常会面对两派激烈的技术争吵: 一派是“性能实用主义者”,他们力挺 Redis:“Redisson 封装完备,单机吞吐破 10 万 QPS,看门狗自动续期极其优雅,全网普及度最高…

2026/10/11 1:52:42 阅读更多 →
会务信息载体的演进:纸质、PDF 与结构化数据源的分发成本与版本一致性

会务信息载体的演进:纸质、PDF 与结构化数据源的分发成本与版本一致性

会务信息管理的本质问题,和很多分布式系统面对的问题很像:一份数据要在多个地方、多个时间点被多个人正确读到,而这期间数据本身还会变。会议这个场景把这个问题放大了。它一次性、不可回滚,所有读者集中在同一时间出现&#xff0…

2026/10/11 1:52:42 阅读更多 →
3Blue1Brown的手写数字图像识别实验复现

3Blue1Brown的手写数字图像识别实验复现

深度学习框架这里用到的是Pytorch。一、加载数据(一)import部分导入一些我们需要的库:import torch from torch import nn #包括sigmoid() linear()等宝藏函数捏 from torch.utils.data import DataLoader #数据集加载器,主要是为…

2026/10/11 1:52:42 阅读更多 →
JavaScript 的原型与继承——对象之间是怎么扯上关系的

JavaScript 的原型与继承——对象之间是怎么扯上关系的

引言如果说作用域和闭包是 JS 的"空间"问题,那原型和继承就是 JS 的"血缘"问题。JS 没有传统面向对象语言里的类继承体系,它用的是另一套逻辑:原型链。这套逻辑让很多人初学时一头雾水,但一旦想通&#xff0c…

2026/10/11 1:52:42 阅读更多 →
枚举类型全解析:从代码可读性到状态机与设备枚举的编程之道

枚举类型全解析:从代码可读性到状态机与设备枚举的编程之道

枚举(enum)类型算是编程里最被低估的关键字了。很多人一提到 enum 就只想到“给数字起名字”,觉得它无非是让type 1变成type TYPE_A,值没变,只是顺眼了一点。我早先也这么觉得,直到后来在业务代码、算法题…

2026/10/11 1:52:42 阅读更多 →
WPF贝塞尔曲线绘制平滑折线图实战指南

WPF贝塞尔曲线绘制平滑折线图实战指南

简介:本资源是一个基于WPF与C#实现的贝塞尔曲线动态折线图可视化项目,面向.NET桌面开发初学者及图形学实践者,解决传统折线图缺乏平滑过渡与动态量程适配的问题。项目完整封装为RAR压缩包(65KB),共36个文件…

2026/10/11 1:51:41 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

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

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

月新闻

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