canvas.toBlob()需要一个回调函数,但canvas.toDataURL()需要同步返回结果。为什么不同?这不是问题,但我非常好奇,我无法找到解释为什么会这样。
因为toDataURL
是一个早期错误...
在它实施的时候(通过Safari IIRC),仍然只讨论FileAPI,并且已经需要导出画布的结果。所以他们制作了这个方法,它确实在一个方便的数据URL中返回数据,你可以直接使用它作为文档中几个元素的src
。此时,同步返回它听起来像一个好主意,Canvas API中的所有内容都是同步的。
但几年后,随着越来越多的实现,越来越多的用途和新的API,很明显toDataURL
不是一个好主意。就像同步XHR一样,如果你已经足够老了,可以记住。
尽管您可以以同步方式获取数据URL,但无论如何显示它都将是一个异步任务。
要从画布生成图像文件是一个缓慢的操作,您需要导出所有像素数据,取消它,然后调用压缩算法。
除此之外,数据URL需要存储为base64编码的String,比它所代表的二进制数据大34%,并且每次在DOM中的某处分配时都会复制到内存中...
FileAPI引入了将二进制数据保存在内存中的方法,并能够显示,操作或将其原样发送到服务器。所有这些都意味着最小的内存开销=>数据URL已经过时(大多数情况下)。
因此,已决定添加一种新方法,该方法将利用这些新API,并返回Blob而不是数据URL。在与UI阻塞操作的共同斗争中,已经决定这种方法是异步的(但不幸的是,这是在Promise进入之前......)。现在所有必须同步完成的工作就是抓住像素数据,就像getImageData
那样。其余操作可以并行完成。