为什么canvas.toBlob和canvas.toDataURL具有不同的返回类型

时间:2019-03-09 05:21:14

标签: javascript html5 html5-canvas todataurl

canvas.toBlob()需要一个回调函数,但是canvas.toDataURL()会同步返回结果。为什么会有所不同?这不是问题,但是我很好奇,我找不到为什么这样做的解释。

1 个答案:

答案 0 :(得分:1)

因为toDataURL是一个早期错误...

在Safari IIRC实施该文件时,仍仅在讨论FileAPI,并且已经需要导出画布结果。因此他们制作了此方法,该方法的确在方便的数据URL中返回了数据,您可以将其直接用作文档中多个元素的src。这时,同步返回听起来不错,Canvas API中的所有内容都是同步的。

但是几年后,随着越来越多的实现,越来越多的用途和新的API,toDataURL显然不是一个好主意。就像同步XHR一样,如果您足够大,可以记住。
即使您可以以同步方式获取数据URL,但无论如何要显示它都是异步任务。

要从画布生成图像文件是一项很慢的操作,您需要导出所有像素数据,将其不相乘,然后调用压缩算法。

此外,数据URL需要以base64编码的字符串形式存储,比它表示的二进制数据大34%,并在每次将其分配到DOM中的某个位置时都复制到内存中...

FileAPI引入了将二进制数据保存在内存中以及能够显示,操纵或将其直接发送到服务器的方法。所有这些暗示着最小的内存开销=>数据URL已过时(在大多数情况下)。

因此,已决定添加一个新方法,该方法将利用这些新API并返回Blob而不是数据URL。在与UI阻止操作的常见对抗中,已经确定此方法将是异步(,但不幸的是,这是在Promise出现之前...)。现在,所有要做的就是像getImageData一样获取像素数据。其余操作可以并行进行。