当前位置:   article > 正文

JS各种数据流之间的格式(ArrayBuffer、Uint8Array、Blob、 File、DataURL)相互转换及应用_uint8array转arraybuffer

uint8array转arraybuffer

JS各种数据流之间的格式(ArrayBuffer、Uint8Array、Blob、 File、DataURL)相互转换及应用

前端网页 File 上传、下载,Canvas 保存图片,Ajax 和 Fetch 二进制流传输,PDF 预览,浏览器上 WebAssembly 的应用 等等都需要到 ArrayBuffer 和 Blob 。

API介绍

  • FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。
  • Blob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream 来用于数据操作。Blob 表示的不一定是 JavaScript 原生格式的数据。File 接口基于 Blob,继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
属性名称读/写描述
size只读Blob 对象中所包含数据的大小(字节)。
type只读一个字符串,表明该Blob对象所包含数据的MIME类型。如果类型未知,则该值为空字符串。例如 “image/png”.
  • ArrayBuffer 对象代表储存二进制数据的一段内存,它不能直接读写,只能通过视图(TypedArray 视图和 DataView 视图)来读写,视图的作用是以指定格式解读二进制数据。
  • Uint8Array 对象是 ArrayBuffer 的一个数据类型(8 位不带符号整数)。
  • TextEncoder 接受代码点流作为输入,并提供 UTF-8 字节流作为输出。
  • TextDecoder 接口表示一个文本解码器,一个解码器只支持一种特定文本编码,例如 utf-8、iso-8859-2、koi8、cp1261,gbk 等等。解码器将字节流作为输入,并提供代码点流作为输出。
  • base64 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。编码规则:把3个字节变成4个字节;每76个字符加一个换行符;最后的结束符也要处理。

注意: 二进制数组并不是真正的
js各种数据流之间的格式转换数组,而是类似数组的对象。

字符与ArrayBuffer,Uint8Array相互转换

1、TextEncoder => ArrayBuffer

  1. let encoder = new TextEncoder();
  2. // 字符 转 Uint8Array
  3. let uint8Array = encoder.encode("你好啊");
  4. // Uint8Array 转 ArrayBuffer
  5. let arrayBuffer = uint8Array.buffer

2、Blob => ArrayBuffer

  1. let str = 'hello,你好吗?'
  2. let blob = new Blob([str],{type:'text/plain;charset=utf-8'});
  3. let utf8decoder = new TextDecoder()
  4. blob.arrayBuffer().then(buffer=>{
  5. // ArrayBuffer
  6. console.log(buffer)
  7. let text = utf8decoder.decode(buffer)
  8. // String
  9. console.log(text)
  10. })

3.FileReader => ArrayBuffer

  1. let str = 'hello,你好吗?'
  2. let blob = new Blob([str],{type:'text/plain;charset=utf-8'});
  3. let utf8decoder = new TextDecoder()
  4. let fr = new FileReader()
  5. fr.readAsArrayBuffer(blob)
  6. fr.onload = function(res) {
  7. // ArrayBuffer
  8. let buffer = fr.result
  9. console.log(buffer)
  10. let text = utf8decoder.decode(buffer)
  11. // String
  12. console.log(text)
  13. }

转换及应用

1.将file转换成DataURL,实现本地图片上传预览

  1. <input type="file" id="file">
  2. <img id="img">
  • 利用URL.createObjectURL()
  1. let img = document.getElementById('img')
  2. let file = document.getElementById('file')
  3. file.onchange = function () {
  4. let imgFile = this.files[0]
  5. img.src = URL.createObjectURL(imgFile)
  6. img.onload = function () {
  7. URL.revokeObjectURL(this.src)
  8. }
  9. }
  • 利用FileReader.readAsDataURL()
  1. let img = document.getElementById('img')
  2. let file = document.getElementById('file')
  3. file.onchange = function (e) {
  4. let imgFile = this.files[0]
  5. let fileReader = new FileReader()
  6. fileReader.readAsDataURL(imgFile)
  7. fileReader.onload = function () {
  8. img.src = this.result
  9. }
  10. }

2、将DataURL转成file

  1. function dataURLToFile (dataUrl, fileName) {
  2. const dataArr = dataUrl.split(',')
  3. const mime = dataArr[0].match(/:(.*);/)[1]
  4. const originStr = atob(dataArr[1])
  5. return new File([originStr], fileName, { type: mime })
  6. }
  7. dataURLToFile('data:text/plain;base64,YWFhYWFhYQ==', '测试文件')
  8. // File {name: '测试文件', lastModified: 1640784525620, lastModifiedDate: Wed Dec 29 2021 21:28:45 GMT+0800 (中国标准时间), webkitRelativePath: '', size: 7, …}

3.将canvas转成DataURL,实现将canvans变成图片,或生成指定格式的图片,实现图片格式的转换

  1. // html
  2. <input type="file" accept="image/*" id="file">
  3. // js
  4. document.querySelector('#file').onchange = function () {
  5. canvasToDataURL(this.files[0])
  6. .then(res => console.log(res))
  7. }
  8. function canvasToDataURL (file) {
  9. return new Promise(resolve => {
  10. const img = document.createElement('img')
  11. img.src = URL.createObjectURL(file)
  12. img.onload = function () {
  13. const canvas = document.createElement('canvas')
  14. canvas.width = img.width
  15. canvas.height = img.height
  16. const ctx = canvas.getContext('2d')
  17. ctx.drawImage(img, 0, 0)
  18. resolve(canvas.toDataURL('image/png', 1))
  19. }
  20. })
  21. }

这个方法返回的是图片base64,用来生成图片的,默认png格式,也可以通过传递参数改变图片格式,还能改变图片保存的质量。

如:canvas.toDataURL(“images/jpeg”,0) ,第一个参数就是把图片编码为jpeg格式,第二个参数(0-1)就是指定图片质量,数值越大质量越高,不过对于image/png格式没法设置图片质量。

另外,chrome还支持自家的image/webp格式图片,也能设置图片质量, 实现图片压缩

4.将DataURL转成canvas

  1. function dataUrlToCanvas (dataUrl) {
  2. return new Promise(resolve => {
  3. const img = new Image()
  4. img.src = dataUrl
  5. img.onload = function () {
  6. const canvas = document.createElement('canvas')
  7. canvas.width = this.width
  8. canvas.height = this.height
  9. const ctx = canvas.getContext('2d')
  10. ctx.drawImage(this, 0, 0)
  11. resolve(canvas)
  12. }
  13. })
  14. }
  15. const dataUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUh...'
  16. dataUrlToCanvas(dataUrl)
  17. .then(res => document.body.appendChild(res)

5.将canvas转成file

1.将canvas转成blob

利用canvas.toBlob()

  1. // html
  2. <input type="file" accept="image/*" id="file">
  3. // js
  4. document.querySelector('#file').onchange = function () {
  5. canvasToDataURL(this.files[0])
  6. .then(res => console.log(res))
  7. }
  8. function canvasToDataURL (file) {
  9. return new Promise(resolve => {
  10. const img = document.createElement('img')
  11. img.src = URL.createObjectURL(file)
  12. img.onload = function () {
  13. const canvas = document.createElement('canvas')
  14. canvas.width = img.width
  15. canvas.height = img.height
  16. const ctx = canvas.getContext('2d')
  17. ctx.drawImage(img, 0, 0)
  18. canvas.toBlob(function (e) {
  19. resolve(e)
  20. }, 'image/png', 1)
  21. }
  22. })
  23. }

2.将blob转成file
利用new File();

  1. function blobToFile(blob, filename, type) {
  2. return new File([blob], filename, { type })
  3. }
  4. blobToFile('test info', 'test', 'text/plain' )

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/145080
推荐阅读
相关标签
  

闽ICP备14008679号