在Canvas中实时将HTML5视频转为黑白效果需逐帧读取视频画面,通过灰度转换公式(0.299r+0.587g+0.114b)修改像素,再用putImageData重绘;须确保视频加载完成、Canvas尺寸匹配、复用ImageData并处理跨域。

要在Canvas中实时将HTML5视频转为黑白效果,核心是利用canvas.getContext('2d')逐帧读取视频画面,通过像素操作(如灰度转换)修改颜色数据,再绘制回Canvas。这不是CSS滤镜的简单叠加,而是底层像素级处理,确保兼容性与可控性。
获取视频帧并绘制到Canvas
需监听video元素的play或timeupdate事件,用drawImage()把当前帧渲染到离屏或显示Canvas上:
- 确保视频已加载元数据(
loadedmetadata)且处于可播放状态,避免黑帧 - Canvas尺寸应与视频自然宽高一致(
canvas.width = video.videoWidth),否则缩放会引入插值失真 - 使用
requestAnimationFrame驱动循环,比setInterval更精准匹配刷新率
提取像素并计算灰度值
调用ctx.getImageData(0, 0, width, height)获取RGBA像素数组,对每个像素执行灰度化公式(常用加权平均法):
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
- 标准系数:
gray = 0.299 * r + 0.587 * g + 0.114 * b(人眼对绿色最敏感) - 将计算出的
gray同时赋给r、g、b通道,a保持不变 - 注意:
ImageData.data是Uint8ClampedArray,值域0–255,无需手动截断
写回Canvas并优化性能
处理完像素后,用ctx.putImageData()重绘。为保障60fps流畅性,需规避常见瓶颈:
立即学习“前端免费学习笔记(深入)”;
- 复用
ImageData对象(提前创建),避免每帧新建造成GC压力 - 若仅需黑白效果,可跳过alpha通道操作,减少33%的循环次数
- 对高清视频(如1080p),考虑降采样处理(如绘制到一半尺寸Canvas再放大),或启用
willReadFrequently: true创建上下文
不复杂但容易忽略:视频跨域时需设置video.crossOrigin = "anonymous",否则getImageData会因安全策略报错。


















