在 Web 开发中,有时我们需要将图片以一种特殊的编码形式进行传输或存储,base64 编码就是一种常见的选择。它将二进制数据转换为文本字符串,这样可以方便地在网络中传输或者存储在一些对数据格式有限制的地方。比如说,我们在网页中嵌入一张小图片时,如果不想单独请求图片文件,就可以将其转换为 base64 编码,直接写在 HTML 代码里。那这个转换过程是怎样的呢?其实,通过一些工具函数或者浏览器提供的 API,我们可以轻松实现图片到 base64 编码的转换。
在这个网站可以拿到base64格式的图片数据
const decodedData = atob(base64Data)
当我们拿到一个 base64 编码的字符串后,如果想要还原它的原始数据,就需要用到atob函数。这个函数是 JavaScript 内置的,它的作用就是将 base64 编码的字符串解码成二进制字符串。举个例子,假设我们有一个图片的 base64 编码字符串base64Data,就可以通过const decodedData = atob(base64Data)这样的代码来进行解码。这里解码后的decodedData是一个普通的字符串,但它的每个字符实际上对应着原始二进制数据中的一个字节的编码。
接下来,我们要介绍一个特殊类型的数组 ——Uint8Array。它表示一个由 8 位无符号整数组成的数组,非常适合用来处理二进制数据。我们知道,计算机存储数据最终都是以二进制的形式,而Uint8Array就是直接操作这种二进制数据的一种方式。
前面我们通过atob函数得到了二进制字符串,现在要把它转换为Uint8Array数组。为什么要这么做呢?因为Uint8Array数组能让我们更方便地对二进制数据进行各种操作。通过一个for循环,我们可以遍历解码后的字符串。在循环中,使用charCodeAt方法获取每个字符对应的 Unicode 编码,然后通过& 0xff操作,将其转换为 8 位无符号整数,存入Uint8Array数组中。例如:
const byteArray = new Uint8Array(decodedData.length);
for (let i = 0; i < decodedData.length; i++) {
byteArray[i] = decodedData.charCodeAt(i);
}
这样,我们就得到了一个真正意义上的二进制数据数组,里面的每个元素都是 0 到 255 之间的整数,对应着原始二进制数据中的每个字节。
现在,我们有了Uint8Array数组,接下来就要引入今天的主角 ——Blob 对象了。Blob,全称是 Binary Large Object,即二进制大对象。在 JavaScript 中,Blob 对象用于表示不可变的二进制数据。我们可以通过Blob构造函数,将前面得到的Uint8Array数组封装成一个 Blob 对象,同时指定数据的类型。比如对于图片,我们可以指定类型为image/png、image/jpeg等。代码如下:
const blob = new Blob([byteArray], { type: "image/png" });
通过这样的操作,我们就把二进制数据以一种更高级、更方便处理的形式封装了起来。Blob 对象不仅可以表示图片,还能表示音频、视频、PDF 文件等各种二进制数据。它就像是一个盒子,把杂乱的二进制数据规整地装了起来,并且告诉外界这个盒子里装的是什么类型的数据。
Blob 对象的强大不仅仅在于它能封装二进制数据,更在于它为我们提供了在二进制层面上进行各种操作的可能。比如,我们可以对 Blob 对象进行切割,从一个大的 Blob 对象中提取出我们需要的部分,生成一个新的 Blob 对象。这在处理大文件上传时非常有用,我们可以将大文件分割成多个小块,分别上传,提高上传的稳定性和效率。
再比如,我们还可以对 Blob 对象进行合并,将多个小的 Blob 对象合并成一个大的 Blob 对象。这种操作在处理一些需要拼接数据的场景中十分实用。而且,Blob 对象还支持与其他 API 的配合使用,为前端开发带来了极大的便利。
当我们有了 Blob 对象后,如何在网页中展示它呢?比如我们想在页面上显示一张通过 Blob 对象表示的图片。这时候,URL.createObjectURL函数就派上用场了。它可以为 Blob 对象生成一个临时的 URL 地址,这个 URL 就像是一个指向 Blob 对象的指针,浏览器可以通过这个 URL 来访问 Blob 对象中的数据。我们可以把这个 URL 赋值给img标签的src属性,从而在页面上显示图片。例如:
const imgUrl = URL.createObjectURL(blob);
document.querySelector('#blobImage').src = imgUrl;
这样,原本存储在 Blob 对象中的图片数据就成功地在网页上展示出来了。这个临时 URL 在页面刷新或者关闭时会自动失效,不用担心会占用过多资源。
在前端开发中,缓存是一个重要的性能优化手段。Blob 对象在浏览器缓存机制中也有着独特的作用。由于 Blob 对象可以表示各种二进制资源,浏览器在处理这些资源时,会根据一定的策略进行缓存。比如对于一些经常使用的图片 Blob 对象,浏览器可能会将其缓存起来,当下次需要再次使用时,直接从缓存中读取,而不需要重新请求或者重新生成。这大大提高了页面的加载速度和性能。而且,Blob 对象的缓存机制与普通文件的缓存机制有所不同,它更加灵活,能够适应一些特殊的前端应用场景。
通过今天的探索,我们深入了解了 HTML5 中的 Blob 对象。从图片的 base64 编码开始,经过解码、转换为Uint8Array数组,再到封装成 Blob 对象,最后通过URL.createObjectURL生成临时 URL 进行展示,每一步都展示了 Blob 对象在处理二进制数据方面的强大能力。