canvas.toBlob()需要一个回调函数,但是canvas.toDataURL()会同步返回结果。为什么会有所不同?这不是问题,但是我很好奇,我找不到为什么这样做的解释。
答案 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
一样获取像素数据。其余操作可以并行进行。