从 Canvas 保存大图的一种方法
条评论 | 0次浏览戏词的网页版已经上线了一段时间了。不得不说,在电脑上可以直接拼,不用再把图片通过微信传到手机上再拼图确实方便很多。不过因为前段时间不多,把拼图功能做出来后就赶紧先安排上线了,很多具体的细节并没有进行测试和优化,所以这周自己在用网页版拼图的时候就遇到了些问题。这个还是向我的用户表示下抱歉,我会在之后的时间进行修复。今天刚修复好一个图片过大无法保存的问题,在这边顺便记一下方法。
说来惭愧,当时上线后我还信誓旦旦在朋友圈说到:“没有了小程序的限制,现在可以无限拼图,不会因为遇到图片太大导致闪退的小程序 bug”。结果自己拼的时候,9 张图只要有一张显示了全图就没办法正常保存。几次试验过后,发现能保存的图片大小都在 2M 以下,基本上确定了是图片过大无法保存的锅。那么接下来就是考虑如何解决了。
网页版目前的保存方式是:用户点击保存后,Canvas 进行绘图,再通过 toDataURL
的方法将图片内容转化为 base64,然后通过 a[download]
让用户通过点击进行下载保存。那既然过大的 base64 会导致下载失败,那么就得换一套方案。
本着“前端事,前端闭”的想法,排除了传文件到后台再由后台生成图片的方案。又因为拼图本就绕不过 Canvas,所以还是得从 Canvas 的接口入手,最后找到了 Canvas 的另一个 api:toBlob
。MDN 文档的中的介绍一开始就提到了:
HTMLCanvasElement.toBlob() 方法创造 Blob 对象,用以展示 canvas 上的图片;这个图片文件可以被缓存或保存到本地,由用户代理端自行决定。
那接下来就是调用的问题了:
1 | canvas.toBlob( |
通过在回调方法中创建 a[download]
并点击的事件,就可以直接保存图片。这样一来便解决了一开始遇到的问题。
- 本文链接:https://blog.decay.fun/2019/11/25/a-way-to-save-large-image-from-canvas/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!
分享View this article in English