我知道我可以使用FileReader
或URL.createObjectURL
将Blob
解析成一个字符串并用它设置image.src
。
但我想知道我是否可以用Blob
直接设置图像内容?
你不能用image.src
直接设置Blob
。 image.src
需要您提供基于http链接,base64数据或虚拟blob URL地址的URL。 Blob
是一个二进制对象,不属于任何上述选项。正如你所说Blob
需要URL.createObjectURL
将其转换为可以被image.src
识别的虚拟blob url地址。
使用您使用URL.createObejctURL(blob);
创建的blobURL。
在评论中,您声明您对浏览器支持和内存使用有疑虑(您甚至谈论内存泄漏......)。
只有少数版本的Chrome确实支持FileReader对象,而不支持URL.createObjectURL(IIRC即v14)。 Internet Explorer在IE10中添加了支持,就像它们对Blob对象和FileReader一样。
blobURL只是指向已经在内存中或仅在磁盘上的数据的指针。指针在内存中没有重量。 另一方面,dataURL是二进制数据的字符串表示。它的权重比它所代表的数据多34%左右(因为二进制文件需要映射到更安全的字符)。
现在,要绘制URI的另一端的图像,
不仅如此,如果你要在多个地方分配这个dataURI,那么每次你复制字符串时它的数据量会增加1.34倍,并且考虑到缓存dataURI的难度,你最终会使用很多内存代表相同的二进制数据......
内存泄漏? 不。没有内存泄漏。只是当blob被blobURL引用时,只要blobURL没有被撤销,GarbageCollector就不能收集这个Blob。但鉴于blobURL的生命周期与创建它的Document相关联,它在下次刷新时无论如何都会死亡。 此外,如果您正在处理来自用户磁盘的数据,那么blobURL实际上只是一个指针,并且没有数据存储在内存中。
FileReader的readAsDataURL
方法实际上只有少数用例,除非您确定必须使用它,否则只需使用blobURL。