用 React + Rust(WebAssembly 模块)开发的简易图像处理 WebApp

2019-04-24 10:49:18 +08:00
 edwardwo

入口

简介

去年底开始学的 Rust, 直到今年春节后, 感觉入了点门, 就想做点啥练练手, 由于一直对图像处理很感兴趣, 且此类应用比较能发挥出 WebAssembly 的特性, 于是折腾一番, 就有了这个 App. 本想等到功能稍微多些, 到了勉强可日常使用的程度再发布, 没想到实际开发中, 难度和工作量远超我的预期, 只能先发布再说.

注: 貌似移动端暂时都不支持 WebAssembly, 因此你只能用桌面 Chrome/Firefox 打开.

基本功能:

某些功能, 如”柔滑”, 其底层的 Bilateral Filter 算法, 我暂时没精力和时间优化, 用的是最粗暴的实现法, 因此执行效率很低, 需要 10 秒以上, 它有 2 个参数: 迭代次数(每次柔滑的结果作为下次的输入), 柔滑半径, 当这 2 个参数值设的较大时, 会产生卡通效果, 如下图所示:

但执行时间会变态到 1, 2 分钟(图片越大, 时间越长, 尽量不要载入长 /宽超过 1000px 的图片), 且执行期间, 你无法关闭该页面.

待编辑的图片除了从电脑本地载入, 也可以读取你的摄像头(有小窗口弹出, 需要你同意). 由于所有的操作都在本地执行(没有一行服务端代码), 因此你的自拍照不会被上传. 我在摄像头返回的 video 上也添加了些有趣的滤镜效果.

其实有些功能直接在 JavaScript 中也可以高效实现, 如: 水平镜像只需 canvasContext.scale(-1, 1), 但出于学习目的, 我还是硬生生直接在 Rust 中实现了.

由于我不太擅长 UI/交互的设计, 虽然界面看上去还行, 其实是完全照抄国外的某在线图片编辑工具befunky.

商业化运营

现在提这个话题, 为时过早, 而且开发初期, 我只是出于练手的目的, 但在开发过程中不时的冒出些想法, 于是就想后续完善它, 从而做成完整的 App. 以下是我的一些想法:

一提到图片编辑, 大部分人想到的就是 PhotoShop, 但这货太专业 /臃肿 /昂贵, 普通用户压根不会用, 也用不起. 但图片编辑的需求却一直存在. 美颜相机类的 App 只是满足了一个刚需. 但还有许多其他的, 如: 风景照中需要把背景中的闲杂人员抠掉, 如: 同一款衣服有不同的颜色, 作为商家, 你不想为模特拍摄多张, 可以在 App 中调整颜色, 生成多款.

因此, 我把 App 在功能上分 3 大块:

以上这些想法, 虽然谈不上是刚需, 但很有趣, 只要有人喜欢, 有人用, App 就有价值. 技术上我有把握实现, 但工作量和难度都很大. 如果你认同我的这些想法, 或者有更好的, 并有意一起开发, 请和我联系.

求职

最后, 顺便求个职(有理想, 有梦想, 也要先有饭吃). 本人(座标: 上海)前后端全干, 后端(Go, NodeJS, Python, Rust)只要不是高并发, 分布式那种高端活, 都能胜任, F*ck 996.

联系方式: ZWR3YXJkLndvODIzQGdtYWlsLmNvbQ==

4377 次点击
所在节点    分享创造
4 条回复
ffeii
2019-04-24 10:57:07 +08:00
ios safari 可以打开
but0n
2019-04-24 11:04:11 +08:00
filter 是用 shader 做的吗?
edwardwo
2019-04-24 11:19:22 +08:00
@ffeii 移动端能打开, 是因为图片是放在<canvas />上展示的, 这个主流浏览器都支持, 但图片的编辑是调用 WebAssembly 模块实现的, 这个移动端都不支持, 因此所有操作, 点击后没反应, 也不会报错.

@but0n 打开摄像头后的 filter 效果是通过 CSS 实现, 你看这行代码就知道了
https://github.com/edwardwohaijun/image-editor/blob/master/www/src/components/Header/Selfie.js#L6

图片的 filter, 如正文中提到的高斯模糊, 柔滑, 这些都是直接在 WebAssembly 中读取<canvas />上的像素值(以数组形式), 然后依次对每个像素执行 2D convolution, 做图像处理的朋友, 都知道这个概念.
but0n
2019-04-24 13:14:32 +08:00
哦,filter 如果用 webgl 会比 2D canvas 快一些,前者是 gpu 逐片元并行计算的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558168

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX