img转换操作(base64、canvas、blob、file对象)

用这几个方法应该就差不多了:

// 根据地址(src)获取图片,生成img对象(标签)
function getImg(src) {
  return new Promise((resolve, reject) => {
    const img = new Image()
    img.src = src
    // 源图片允许跨域,否则canvas转base64时,toDataURL会报错
    img.setAttribute('crossOrigin', 'anonymous')
    img.onload = function () {
      resolve(img)
    }
  })
}

// 绘制图片并将canvas转为base64 或blob
function canvas2Img(img) {
  const canvas = document.createElement('canvas')
  canvas.width = img.width
  canvas.height = img.height

  const ctx = canvas.getContext('2d')
  // 绘制原图(大小自己限制啦)
  ctx.drawImage(img, 0, 0)

  const base64 = canvas.toDataURL('image/png')
  /* 转为blob对象 toBlob方法第一个参数是回调函数,第二个是图片格式默认值image/png,第三个为图片质量 */
  // canvas.toBlob(blob => {
  //  console.log('blob:', blob)
  //  const url = URL.createObjectURL(blob)
  //  console.log('url:', url)
  //  URL.revokeObjectURL(url)
  // })
  canvas.remove()

  return base64
}

// base64转blob
function dataURItoBlob(base64) {
  let byteString
  const arr = base64.split(',')

  if (arr[0].indexOf('base64') !== -1) {
    // 转回字符串数据
    byteString = atob(arr[1])
  } else {
    // 没有base64标志,使用unescape解码回字符串数据
    byteString = unescape(arr[1])
  }

  // 获取文件格式
  const mimeString = arr[0].split(':')[1].split(';')[0]
  // 创建一个8位无符号整型数组,长度为字符数据长度
  const ia = new Uint8Array(byteString.length)
  for (let i = 0; i < byteString.length; i++) {
    // 存入ascii码
    ia[i] = byteString.charCodeAt(i)
  }

  return new Blob([ia], { type: mimeString })
}

// blob 转 file 一行代码就行了
function blobToFile(blob) {
  return new File([blob], '文件名.png', { type: blob.type })
}

// file 转 blob也是一行,毕竟file就是一种特殊的blob
function fileToBlob(file) {
  return new Blob([file], { type: file.type })
}

最后再加一个文件转base64的方法

// 文件转base64(file:用户选择的文件e.target.files[0],或下载的blob对象)
function fileToBase64(file) {
  return new Promise((resolve, reject) => {
    const fileReader = new FileReader()
    fileReader.readAsDataURL(file)
    fileReader.onload = function (e) {
      console.log('e.target.result:', e.target.result)
      resolve(e.target.result)
    }
  })
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 JavaScriptFileReader 和 Canvas API 实现图片压缩并转换base64 编码。 首先,使用 FileReader 将图片读取为 Blob 对象,然后使用 Canvas API 将图片压缩为指定的宽度和高度,最后将压缩后的图片转换base64 编码。 以下是一个示例代码: ``` function compressAndConvertToBase64(file, maxWidth, maxHeight, callback) { const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function(event) { const img = new Image(); img.src = event.target.result; img.onload = function() { const canvas = document.createElement('canvas'); let width = img.width; let height = img.height; if (width > height) { if (width > maxWidth) { height *= maxWidth / width; width = maxWidth; } } else { if (height > maxHeight) { width *= maxHeight / height; height = maxHeight; } } canvas.width = width; canvas.height = height; const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, width, height); const compressedBase64 = canvas.toDataURL('image/jpeg', 0.7); callback(compressedBase64); } } } ``` 其中,参数 `file` 是要压缩的图片文件,`maxWidth` 和 `maxHeight` 分别是压缩后的图片最大宽度和高度,`callback` 是压缩完成后的回调函数。压缩后的图片质量可以通过 `toDataURL` 方法的第二个参数来控制,值越小表示压缩后的图片质量越低。 使用示例: ``` const fileInput = document.querySelector('#file-input'); fileInput.addEventListener('change', function() { const file = fileInput.files[0]; compressAndConvertToBase64(file, 800, 600, function(base64) { console.log(base64); }); }); ``` 以上代码可以将选择的文件压缩为最大宽度为 800、最大高度为 600 的图片,并将压缩后的图片转换base64 编码输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值