js各种数据流之间的格式转换(blob、file、DataURL、canvas、ArrayBuffer)

本文详细介绍了如何在JavaScript中进行Blob、File、DataURL之间的转换,包括利用FileReader、URL.createObjectURL等API,以及处理canvas的Base64编码和解码操作,适合前端开发者深入理解文件处理和数据格式转换。
摘要由CSDN通过智能技术生成


在这里插入图片描述

将blob转成file

利用new File();

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

输出如下
在这里插入图片描述
更进一步了解可阅读Js File() Blob()讲解

将file转换成DataURL

  • 利用URL.createObjectURL()
 <input type="file" id="file">
 <img id="img">
 let img = document.getElementById('img')
 let file = document.getElementById('file')
 file.onchange = function () {
   let imgFile = this.files[0]
   img.src = URL.createObjectURL(imgFile)
   img.onload = function () {
     URL.revokeObjectURL(this.src)
   }
 }

更进一步了解可阅读URL.createObjectURL讲解

  • 利用FileReader.readAsDataURL()
let img = document.getElementById('img')
let file = document.getElementById('file')
file.onchange = function (e) {
  let imgFile = this.files[0]
  let fileReader = new FileReader()
  fileReader.readAsDataURL(imgFile)
  fileReader.onload = function () {
    img.src = this.result
  }
}

更进一步了解可阅读FileReader简介

将DataURL转成file

function dataURLToFile (dataUrl, fileName) {
  const dataArr = dataUrl.split(',')
  const mime = dataArr[0].match(/:(.*);/)[1]
  const originStr = atob(dataArr[1])
  return new File([originStr], fileName, { type: mime })
}
dataURLToFile('data:text/plain;base64,YWFhYWFhYQ==', '测试文件')

// File {name: '测试文件', lastModified: 1640784525620, lastModifiedDate: Wed Dec 29 2021 21:28:45 GMT+0800 (中国标准时间), webkitRelativePath: '', size: 7, …}

复杂处理方式如下

function dataURLToFile (dataUrl, filename) {
  const dataArr = dataUrl.split(',')
  const mime = dataArr[0].match(/:(.*);/)[1]
  const originStr = atob(dataArr[1])
  let n = originStr.length
  const u8Arr = new Uint8Array(n)
  while (n--) {
    u8Arr[n] = originStr.charCodeAt(n)
  }
  return new File([u8Arr], filename, { type: mime })
}
dataURLToFile('data:text/plain;base64,YWFhYWFhYQ==', '测试文件')
 console.log(dataURLToFile('data:text/plain;base64,YWFhYWFhYQ==','测试文件'));
 // File {name: '测试文件', lastModified: 1640784866937, lastModifiedDate: Wed Dec 29 2021 21:34:26 GMT+0800 (中国标准时间), webkitRelativePath: '', size: 7, …}

将canvas转成DataURL

利用canvas.toDataURL()

 // html
 <input type="file" accept="image/*" id="file">

// js
document.querySelector('#file').onchange = function () {
  canvasToDataURL(this.files[0])
    .then(res => console.log(res))
}
function canvasToDataURL (file) {
  return new Promise(resolve => {
    const img = document.createElement('img')
    img.src = URL.createObjectURL(file)
    img.onload = function () {
      const canvas = document.createElement('canvas')
      canvas.width = img.width
      canvas.height = img.height
      const ctx = canvas.getContext('2d')
      ctx.drawImage(img, 0, 0)
      resolve(canvas.toDataURL('image/png', 1))
    }
  })
}

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

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

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

将DataURL转成canvas

function dataUrlToCanvas (dataUrl) {
  return new Promise(resolve => {
    const img = new Image()
    img.src = dataUrl
    img.onload = function () {
      const canvas = document.createElement('canvas')
      canvas.width = this.width
      canvas.height = this.height
      const ctx = canvas.getContext('2d')
      ctx.drawImage(this, 0, 0)
      resolve(canvas)
    }
  })
}
const dataUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUh...'
dataUrlToCanvas(dataUrl)
  .then(res => document.body.appendChild(res))

将canvas转成blob

利用canvas.toBlob()

 // html
 <input type="file" accept="image/*" id="file">

// js
document.querySelector('#file').onchange = function () {
  canvasToDataURL(this.files[0])
    .then(res => console.log(res))
}
function canvasToDataURL (file) {
  return new Promise(resolve => {
    const img = document.createElement('img')
    img.src = URL.createObjectURL(file)
    img.onload = function () {
      const canvas = document.createElement('canvas')
      canvas.width = img.width
      canvas.height = img.height
      const ctx = canvas.getContext('2d')
      ctx.drawImage(img, 0, 0)
      canvas.toBlob(function (e) {
        resolve(e)
      }, 'image/png', 1)
    }
  })
}

将canvas转成file

canvas转成Blob,然后将Blob转成file即可,可看最开始的文件类型转换流程图。

或将canvas转成dataURL,然后将dataURL转成file即可,可看最开始的文件类型转换流程图。

blob转arrayBuffer

利用FileReader.readAsArrayBuffer()

function blobToArrayBuffer (blob, callback) {
  const reader = new FileReader()
  reader.readAsArrayBuffer(blob)
  reader.onload = function () {
    callback(this.result)
  }
}
let blob = new Blob([1, 2, 3, 4, 5])
blobToArrayBuffer(blob, (arrayBuffer) => { console.log(arrayBuffer) })
 // ArrayBuffer(5)

arrayBuffer转blob

利用new Blob()

function arrayBufferToBlob (arrayBuffer, type) {
  return new Blob([arrayBuffer], { type })
}
blobToArrayBuffer(new Blob([1, 2, 3, 4, 5]), (arrayBuffer) => {
  console.log(arrayBufferToBlob(arrayBuffer, 'text/plain'))
  // Blob {size: 5, type: 'text/plain'}
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

定栓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值