本地/在线图片转base64

262 阅读1分钟

1.本地上传图片转base64

当我们想将本地上传的图片转为base64使用时,可以使用以下方法:

<input type="file" multiple onchange="handleChange(event)" accept="image/png,image/jpeg,image/gif,image/jpg"/>
async function handleChange(event) {
    const files = event.target.files
    if (!files.length) {
        return
    }
    for (const file of files) {
        const { base64 } = await getImageToBase64(file)
        console.log(base64)
    }
}

function getImageToBase64(file) {
    return new Promise((resolve, reject) => {
        const fd = new FileReader()
        fd.readAsDataURL(file)
        fd.onload = (e) => {
          const target = e.target || null
          if (target && target.result) {
            const base64 = target.result
            resolve({ base64 })
          }
        }
        fd.onerror = reject
      })
    }

可选择一张或多张进行上传转换。

2.在线图片转base64(使用canvas绘制)

当我们想将在线url图片链接转换为base64时,对图片的要求不高时,可以使用如下方法:

<canvas id="canvas" style="display: none;"></canvas>
// 图片url
const onlineUrl = 'https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/leancloud-assets/5d70fd6af940df373834.png~tplv-t2oaga2asx-image.image'

function getImageUrlTobase64(url) {
    const image = document.createElement('img')
    const canvas = document.getElementById('canvas')
    image.crossOrigin = 'Anonymous'
    image.onload = function() {
        canvas.width = image.width
        canvas.height = image.height
        const ctx = canvas.getContext('2d')
        ctx.clearRect(0, 0, canvas.width, canvas.height)
        ctx.drawImage(image, 0, 0, canvas.width, canvas.width)
        const dataURL = canvas.toDataURL('image/png', 1)
        console.log(dataURL)
    }
    image.onerror = function(err) {
          console.log(err)
    }
    image.src = url
}

getImageUrlTobase64(onlineUrl)

缺陷:

1.当绘制图像大小与原图像素不一致时图片会变模糊。

2.原图如果为纯色背景,背景会被填充为黑色。

3.在线图片下载转base64

当我们想将在线url图片链接转换为base64时,想要保持原图清晰度,可以使用如下方法:

const onlineUrl = `https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/leancloud-assets/0d614af263aa63aa6a77.png~tplv-t2oaga2asx-image.image`

const getImageUrlDownloadToBase64 = () => {
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest()
        xhr.open('get', url, true)
        xhr.responseType = 'blob'
        xhr.onload = function () {
          if (this.status === 200) {
            const blob = this.response
            const oFileReader = new FileReader()
            oFileReader.onloadend = function (e) {
              if (e.target && e.target.result) {
                const base64 = e.target.result
                resolve(base64)
              } else {
                reject()
              }
            }
            oFileReader.onerror = reject
            oFileReader.readAsDataURL(blob)
          } else {
            reject()
          }
        }
        xhr.send()
    })
}

getImageUrlDownloadToBase64(onlineUrl).then((res) => {
    console.log(res)
}).catch((err) => {
    console.log(err)
})