无法解码 url 处的图像_使用 Go 在 WASM 中进行图像处理的实验

Go 的主分支最近完成了一个 WebAssembly 的工作原型实现。作为 WASM 的爱好者,我自然要把玩一下。

这篇文章,我要记下周末我用 Go 做的处理图像实验的想法。这个演示只是从浏览器中获取图像输入,然后应用各种图像变换,如亮度,对比度,色调,饱和度等,最后将其转储回浏览器。这测试了两件事 - 简单的CPU绑定执行,这是图像转换应该做的事情,以及在 JS 和 Go 之间传递数据。

回调

应该明确如何在 JS 和 Go 之间进行调用,不是我们在 emscripten 中的常用的方式;它是暴露一个函数然后从 JS 调用它。在 Go 中,JS 的互操作是通过回调完成的。在您的 GO 代码中,设置可以从 JS 调用的回调。这些是您希望在 GO 代码中执行的主要事件处理程序。

它看起像这样 -

js.NewEventCallback(js.PreventDefault, func(ev js.Value) {
    // handle event
})

这有个模式-随着你的应用增长,它成为一个 DOM 事件回调处理程序列表。我把它看作 REST 应用的 URL 处理器。

为了规范,我把所有回调作为我的主结构的方法并在一个地方关联它们。类似于你把 URL 处理器声明在不同的文件里并在一个地方设置所有路由一样。

// Setup callbacks
s.setupOnImgLoadCb()
js.Global.Get("document").
    Call("getElementById", "sourceImg").
    Call("addEventListener", "load", s.onImgLoadCb)

s.setupBrightnessCb()
js.Global.Get("document").
    Call("getElementById", "brightness").
    Call("addEventListener", "change", s.brightnessCb)

s.setupContrastCb()
js.Global.Get("document").
    Call("getElementById", "contrast").
    Call("addEventListener", "change", s.contrastCb)

然后在一个单独文件里编写您的回调 -

func (s *Shimmer) setupHueCb() {
    s.hueCb = js.NewEventCallback(js.PreventDefault, func(ev js.Value) {
        // quick return if no source image is yet uploaded
        if s.sourceImg == nil {
            return
        }
        delta := ev.Get("target").Get("value").Int()
        start := time.Now()
        res := adjust.Hue(s.sourceImg, delta)
        s.updateImage(res, start)
    })
}

执行

我吐槽的是图像数据从 Go 传给浏览器的方式。在图像上传时,我把 src 属性设置为整个图像的base64编码格式,该值传到 Go 代码中对其解码为二进制,应用转换然后再编回 base64 并设置目标图像的 src 属性。

这使得 DOM 非常沉重,需要从 Go 传递一个巨大的字符串到 JS。 如果 WASM 中 SharedArrayBuffer 有所支持可能会改善。我也在研究在画布中直接设置像素,看看有没有任何好处。即使为了消减这个 base64 转换也应该花些时间。(请不吝赐教其他方法)

性能

对于一个 100KB 的 JPEG图像,应用转换所需时间约为180~190毫秒。这个时间随着图像大小而增加。这是使用 Chrome 65 测试的。(FF一直报错,我也没时间调查)

bff8747809282de616501e601172d9ac.png

性能快照显示

a5495b2a32ae936d1a91d058d49d0a01.png

堆相当大。堆快照大约1GB

整理想法

完整库在这 - github.com/agnivade/shimmer。随意使用。提醒一下这是我一天写的,所有显然会有改进的地方。我会进一步研究。

附:- 请注意,图像变换不会应用于另一个图像之上。就是说如果您更改亮度然后更改色调,则生成的图像将仅改变原始图像的色调。这是现在的待办项目。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
selfie_segmentation_solution_simd_wasm_bin.js 是一个自拍分割解决方案的 JavaScript 文件。该文件利用 SIMD (单指令多数据) 和 WebAssembly 技术实现了自拍分割功能,并以二进制格式保存。 自拍分割是一种利用计算机视觉技术将自拍照片的人物主体与背景进行分离的方法。这种技术可以应用于很多场景,比如制作虚化背景效果、替换背景、添加特效等等。 SIMD 是一种并行计算技术,它使用单个指令同时对多个数据进行操作,可以提高计算效率。由于自拍分割需要对图像的每个像素进行计算,利用 SIMD 可以加快分割速度,使得实时应用变得可能。 WebAssembly (简称wasm) 则是一种基于低级汇编语言的二进制格式,它可以在现代浏览器运行,提供了更高性能的计算能力。通过将自拍分割算法编译为 wasm 格式,可以在浏览器快速加载和执行算法,而无需依赖于服务器端的计算资源。 selfie_segmentation_solution_simd_wasm_bin.js 文件包含了已经编译为 wasm 格式的自拍分割算法的二进制数据,可以通过浏览器的 WebAssembly 接口加载并使用使用这个文件,开发者可以轻松地将自拍分割功能集成到自己的网页应用,实现各种有趣的效果。 总结来说,selfie_segmentation_solution_simd_wasm_bin.js 是一个实现自拍分割功能的 JavaScript 文件,利用了 SIMD 和 WebAssembly 技术提高了计算效率和性能,可以在浏览器快速加载和执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值