由 Rust + WebAssembly 驱动
将图片拖放到此处
或点击选择文件
加载一张本地图片,由 WASM 逐像素处理,实时对比原图和滤镜效果。图片不会上传,所有处理都在浏览器本地完成。
0.299R + 0.587G + 0.114B(ITU-R BT.601 标准)。255 − 原值,透明度不变。Gx 和垂直梯度 Gy,梯度大小 √(Gx² + Gy²) 越大,说明那里的亮度变化越剧烈,也就是边缘。[−2 −1 0; −1 1 1; 0 1 2] 模拟左上方的光照,结果加 128 作为中性灰底色。卷积类滤镜需要读取周围像素,因此图像最外面一圈像素不做处理。
getImageData() 取出 RGBA 像素数组。apply_filter(像素, 宽, 高, 滤镜编号),像素数组被复制进 WASM 内存,在 Rust 中作为 &[u8] 读取。putImageData() 把结果画到右侧 Canvas。apply_filter 函数也被「实时视频滤镜」复用,用来处理 30fps 的摄像头画面。源码crates/media/image-filter/src/lib.rswww/image-filter/index.js